Skip to content

Commit 66a3830

Browse files
committed
Reduce string allocations in split operations where possible.
1 parent 8244415 commit 66a3830

37 files changed

Lines changed: 22 additions & 21 deletions

src/PSADT/PSADT.Interop/Utilities/ExceptionUtilities.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ private static string GetStackTraceAtPrefix()
290290
if (ex.StackTrace is string trace)
291291
{
292292
string marker = nameof(ExceptionUtilities) + "." + nameof(GetStackTraceAtPrefix);
293-
foreach (string line in trace.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries))
293+
foreach (string line in trace.Split(["\r\n", "\n"], StringSplitOptions.RemoveEmptyEntries))
294294
{
295295
string trimmed = line.TrimStart();
296296
int idx = trimmed.IndexOf(marker, StringComparison.Ordinal);

src/PSADT/PSADT/Types/ShortcutLnk.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public bool IsValidHotkey()
6262
{
6363
return false;
6464
}
65-
string[] parts = Hotkey!.Split('+');
65+
string[] parts = Hotkey!.Split(['+'], StringSplitOptions.RemoveEmptyEntries);
6666
if (parts.Length < 2)
6767
{
6868
return false;

src/PSADT/PSADT/Utilities/MiscUtilities.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static IReadOnlyList<string> TrimLeadingTrailingLines(IEnumerable<string>
3535
public static string TrimLeadingTrailingLines(string value)
3636
{
3737
ArgumentNullException.ThrowIfNull(value);
38-
return string.Join(Environment.NewLine, TrimLeadingTrailingLines(value.Replace("\r", null).Split('\n')));
38+
return string.Join(Environment.NewLine, TrimLeadingTrailingLines(value.Split(["\r\n", "\n"], StringSplitOptions.None)));
3939
}
4040

4141
/// <summary>

src/PSADT/PSADT/WindowsInstaller/MsiUtilities.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public static IReadOnlyList<Guid> GetMspSupportedProductCodes(string szDatabaseP
285285
using MsiCloseHandleSafeHandle hSummaryInfo = GetSummaryInformation(szDatabasePath);
286286
return GetSummaryInfoStringProperty(hSummaryInfo, MSI_PROPERTY_ID.PID_TEMPLATE) is not string template || string.IsNullOrWhiteSpace(template)
287287
? throw new InvalidOperationException("The patch database did not contain a valid PID_TEMPLATE property with supported product codes.")
288-
: (IReadOnlyList<Guid>)new ReadOnlyCollection<Guid>([.. template.Split(';').Select(static g => new Guid(g))]);
288+
: (IReadOnlyList<Guid>)new ReadOnlyCollection<Guid>([.. template.Split([';'], StringSplitOptions.RemoveEmptyEntries).Select(static g => new Guid(g))]);
289289
}
290290

291291
/// <summary>

src/PSADT/PSAppDeployToolkit/Logging/LogEntry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal LogEntry(DateTime timeStamp, string message, LogSeverity severity, stri
4747
CallerFileName = callerFileName;
4848
CallerSource = callerSource;
4949
LegacyLogLine = $"[{timeStamp:O}]{(scriptSection is not null ? $" [{scriptSection}]" : null)} [{source}] [{severity}] :: {LogUtilities.ReplaceInvalidSurrogates(Message)}";
50-
CMTraceLogLine = $"<![LOG[{(scriptSection is not null && Message != LogUtilities.LogDivider ? $"[{scriptSection}] :: " : null)}{(Message.Contains('\n') ? (string.Join(Environment.NewLine, LogUtilities.ReplaceInvalidSurrogates(Message).Replace("\r", null).Split('\n').Select(static m => string.IsNullOrWhiteSpace(m) ? LeadingSpaceString : CMTraceFirstChar.Match(m).Index is int start && start > 0 ? string.Concat(new(LeadingSpaceChar, start), m.Substring(start)) : m)) + Environment.NewLine) : LogUtilities.ReplaceInvalidSurrogates(Message))}]LOG]!><time=\"{timeStamp.ToString(@"HH\:mm\:ss.fff", CultureInfo.InvariantCulture)}{(TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes >= 0 ? $"+{TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes}" : TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes.ToString(CultureInfo.InvariantCulture))}\" date=\"{timeStamp.ToString("M-dd-yyyy", CultureInfo.InvariantCulture)}\" component=\"{source}\" context=\"{AccountUtilities.CallerUsername}\" type=\"{(uint)severity}\" thread=\"{AccountUtilities.CallerProcessId}\" file=\"{callerFileName}\">";
50+
CMTraceLogLine = $"<![LOG[{(scriptSection is not null && Message != LogUtilities.LogDivider ? $"[{scriptSection}] :: " : null)}{(Message.Contains('\n') ? (string.Join(Environment.NewLine, LogUtilities.ReplaceInvalidSurrogates(Message).Split(["\r\n", "\n"], StringSplitOptions.None).Select(static m => string.IsNullOrWhiteSpace(m) ? LeadingSpaceString : CMTraceFirstChar.Match(m).Index is int start && start > 0 ? string.Concat(new(LeadingSpaceChar, start), m.Substring(start)) : m)) + Environment.NewLine) : LogUtilities.ReplaceInvalidSurrogates(Message))}]LOG]!><time=\"{timeStamp.ToString(@"HH\:mm\:ss.fff", CultureInfo.InvariantCulture)}{(TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes >= 0 ? $"+{TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes}" : TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes.ToString(CultureInfo.InvariantCulture))}\" date=\"{timeStamp.ToString("M-dd-yyyy", CultureInfo.InvariantCulture)}\" component=\"{source}\" context=\"{AccountUtilities.CallerUsername}\" type=\"{(uint)severity}\" thread=\"{AccountUtilities.CallerProcessId}\" file=\"{callerFileName}\">";
5151
}
5252

5353
/// <summary>

src/PSAppDeployToolkit.Build/Private/Get-ADTInstalledModuleFromModulePath.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function Get-ADTInstalledModuleFromModulePath
7777

7878
# Get each individual ModulePath values. We reverse the array so we can return objects
7979
# in order of SystemDirectory/ProgramFiles/UserDirectory like PowerShellGet does.
80-
$modulePaths = [System.Environment]::GetEnvironmentVariable('PSModulePath').Split(';', [System.StringSplitOptions]::RemoveEmptyEntries).Trim() | & {
80+
$modulePaths = [System.Environment]::GetEnvironmentVariable('PSModulePath').Split(';', [System.StringSplitOptions]::RemoveEmptyEntries).Where({ ![System.String]::IsNullOrWhiteSpace($_) }).Trim() | & {
8181
begin
8282
{
8383
# Open collector to reverse at the end.

src/PSAppDeployToolkit.Build/Private/Invoke-ADTDocusaurusExport.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function Invoke-ADTDocusaurusExport
2121
# Trim the file, fix hard-coded line breaks, and fix manually defined code fences.
2222
if (($content = [System.IO.File]::ReadAllText($file.FullName)) -ne ($newContent = $content.Trim().Replace('&lt;br /&gt;', '<br />').Replace('\{', '{').Replace('\}', '}') -replace '```\s+```powershell\s+```powershell\s+', "``````powershell`n"))
2323
{
24-
[System.IO.File]::WriteAllLines($file.FullName, $newContent.Replace("`r", [System.Management.Automation.Language.NullString]::Value).Split(0x0A).TrimEnd())
24+
[System.IO.File]::WriteAllLines($file.FullName, $newContent.Split([System.String[]]("`r`n", "`n"), [System.StringSplitOptions]::None).TrimEnd())
2525
}
2626
}
2727
Complete-ADTModuleBuildFunction

src/PSAppDeployToolkit.Build/Private/Invoke-ADTMarkdownExport.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ function Invoke-ADTMarkdownExport
177177
# Write the content back to disk if there's changes.
178178
if ($newContent -ne $content)
179179
{
180-
[System.IO.File]::WriteAllLines($file.FullName, $newContent.Replace("`r", [System.Management.Automation.Language.NullString]::Value).Split(0x0A).TrimEnd())
180+
[System.IO.File]::WriteAllLines($file.FullName, $newContent.Split([System.String[]]("`r`n", "`n"), [System.StringSplitOptions]::None).TrimEnd())
181181
}
182182
}
183183

@@ -201,7 +201,7 @@ function Invoke-ADTMarkdownExport
201201
{
202202
for ($i = 0; $i -lt $MissingDocumentation.Count; $i++)
203203
{
204-
$output = ($MissingDocumentation[$i] | Select-Object -Property FileName, LineNumber, Line | Format-List -Property * | Out-String -Width ([System.Int32]::MaxValue)).Replace("`r", [System.Management.Automation.Language.NullString]::Value).Trim().Split(0x0A).Trim() -replace '^', "> "
204+
$output = ($MissingDocumentation[$i] | Select-Object -Property FileName, LineNumber, Line | Format-List -Property * | Out-String -Width ([System.Int32]::MaxValue)).Trim().Split([System.String[]]("`r`n", "`n"), [System.StringSplitOptions]::None).Trim() -replace '^', "> "
205205
Write-ADTBuildLogEntry -Message "Output for missing documentation MatchInfo [$($i+1)/$($MissingDocumentation.Count)]" -ForegroundColor DarkRed
206206
Write-ADTBuildLogEntry -Message $output -ForegroundColor DarkRed
207207
}

src/PSAppDeployToolkit.Build/Private/Show-ADTModuleInitArtwork.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function Show-ADTModuleInitArtwork
2727
$null = if ($Script:ModuleConstants.InitializationArtwork.Style.Equals('Raster'))
2828
{
2929
# Get each line.
30-
$Script:ModuleConstants.InitializationArtwork.Banner.Replace("`r", [System.Management.Automation.Language.NullString]::Value).Split(0x0A).ForEach({
30+
$Script:ModuleConstants.InitializationArtwork.Banner.Split([System.String[]]("`r`n", "`n"), [System.StringSplitOptions]::None).ForEach({
3131
# Print each line's character, then place a line feed before continuing.
3232
$_.GetEnumerator().ForEach({
3333
# Log the start time, write the character and spin until enough ticks have elapsed. 10000 ticks is 1 millisecond.
@@ -42,7 +42,7 @@ function Show-ADTModuleInitArtwork
4242
else
4343
{
4444
# Get each line and draw one-by-one.
45-
$Script:ModuleConstants.InitializationArtwork.Banner.Replace("`r", [System.Management.Automation.Language.NullString]::Value).Split(0x0A).ForEach({
45+
$Script:ModuleConstants.InitializationArtwork.Banner.Split([System.String[]]("`r`n", "`n"), [System.StringSplitOptions]::None).ForEach({
4646
[System.Console]::WriteLine($_)
4747
[System.Threading.Thread]::Sleep(125)
4848
})

src/PSAppDeployToolkit.Build/Private/Test-ADTBuildEnvironment.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function Test-ADTBuildEnvironment
3434

3535
# Confirm there's no conflicting module within the PSModulePath (i.e. installed from the gallery).
3636
Write-ADTBuildLogEntry -Message "Verifying $($Script:ModuleConstants.ModuleName) is not present within any PSModulePath directory."
37-
if (Get-ChildItem -LiteralPath $env:PSModulePath.Split(';') -Filter $Script:ModuleConstants.ModuleName -ErrorAction Ignore)
37+
if (Get-ChildItem -LiteralPath $env:PSModulePath.Split(';', [System.StringSplitOptions]::RemoveEmptyEntries).Where({ ![System.String]::IsNullOrWhiteSpace($_) }).Trim() -Filter $Script:ModuleConstants.ModuleName -ErrorAction Ignore)
3838
{
3939
throw "A conflicting $($Script:ModuleConstants.ModuleName) module was found within a PSModulePath directory. Please uninstall any $($Script:ModuleConstants.ModuleName) modules from the PSGallery and try again."
4040
}

0 commit comments

Comments
 (0)