Browse Source

perf: Micro optimization EndsWith using (#13084)

* perf: Micro optimization EndsWith using

* fix: Address reviews

* fix: Address reviews

---------

Co-authored-by: Max Katz <maxkatz6@outlook.com>
pull/13106/head
workgroupengineering 2 years ago
committed by GitHub
parent
commit
af254d50e4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Avalonia.sln
  2. 2
      src/Avalonia.Base/Animation/Cue.cs
  3. 4
      src/Avalonia.Base/Media/Color.cs
  4. 6
      src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs
  5. 4
      src/Avalonia.Base/Media/HslColor.cs
  6. 4
      src/Avalonia.Base/RelativePoint.cs
  7. 1
      src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
  8. 7
      src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs
  9. 14
      src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
  10. 4
      src/Shared/StringCompatibilityExtensions.cs
  11. 9
      src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs
  12. 2
      src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs

2
Avalonia.sln

@ -42,7 +42,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A689DE
src\Shared\ModuleInitializer.cs = src\Shared\ModuleInitializer.cs src\Shared\ModuleInitializer.cs = src\Shared\ModuleInitializer.cs
src\Shared\NullableAttributes.cs = src\Shared\NullableAttributes.cs src\Shared\NullableAttributes.cs = src\Shared\NullableAttributes.cs
src\Shared\SourceGeneratorAttributes.cs = src\Shared\SourceGeneratorAttributes.cs src\Shared\SourceGeneratorAttributes.cs = src\Shared\SourceGeneratorAttributes.cs
src\Avalonia.Base\Compatibility\StringCompatibilityExtensions.cs = src\Avalonia.Base\Compatibility\StringCompatibilityExtensions.cs src\Shared\StringCompatibilityExtensions.cs = src\Shared\StringCompatibilityExtensions.cs
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI", "src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj", "{6417B24E-49C2-4985-8DB2-3AB9D898EC91}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.ReactiveUI", "src\Avalonia.ReactiveUI\Avalonia.ReactiveUI.csproj", "{6417B24E-49C2-4985-8DB2-3AB9D898EC91}"

2
src/Avalonia.Base/Animation/Cue.cs

@ -34,7 +34,7 @@ namespace Avalonia.Animation
{ {
string v = value; string v = value;
if (value.EndsWith("%")) if (value.EndsWith('%'))
{ {
v = v.TrimEnd('%'); v = v.TrimEnd('%');
} }

4
src/Avalonia.Base/Media/Color.cs

@ -346,7 +346,7 @@ namespace Avalonia.Media
if (workingString.Length >= 11 && if (workingString.Length >= 11 &&
workingString.StartsWith("rgba(", StringComparison.OrdinalIgnoreCase) && workingString.StartsWith("rgba(", StringComparison.OrdinalIgnoreCase) &&
workingString.EndsWith(")", StringComparison.Ordinal)) workingString.EndsWith(')'))
{ {
workingString = workingString.Substring(5, workingString.Length - 6); workingString = workingString.Substring(5, workingString.Length - 6);
prefixMatched = true; prefixMatched = true;
@ -355,7 +355,7 @@ namespace Avalonia.Media
if (prefixMatched == false && if (prefixMatched == false &&
workingString.Length >= 10 && workingString.Length >= 10 &&
workingString.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase) && workingString.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase) &&
workingString.EndsWith(")", StringComparison.Ordinal)) workingString.EndsWith(')'))
{ {
workingString = workingString.Substring(4, workingString.Length - 5); workingString = workingString.Substring(4, workingString.Length - 5);
prefixMatched = true; prefixMatched = true;

6
src/Avalonia.Base/Media/Fonts/FontFamilyLoader.cs

@ -94,14 +94,14 @@ namespace Avalonia.Media.Fonts
{ {
var path = x.GetUnescapeAbsolutePath(); var path = x.GetUnescapeAbsolutePath();
return path.IndexOf(filePattern, StringComparison.Ordinal) >= 0 return path.IndexOf(filePattern, StringComparison.Ordinal) >= 0
&& path.EndsWith(fileExtension, StringComparison.Ordinal); && path.EndsWith(fileExtension, StringComparison.OrdinalIgnoreCase);
} }
private static bool IsFontTtfOrOtf(Uri uri) private static bool IsFontTtfOrOtf(Uri uri)
{ {
var sourceWithoutArguments = GetSubString(uri.OriginalString, '?'); var sourceWithoutArguments = GetSubString(uri.OriginalString, '?');
return sourceWithoutArguments.EndsWith(".ttf", StringComparison.Ordinal) return sourceWithoutArguments.EndsWith(".ttf", StringComparison.OrdinalIgnoreCase)
|| sourceWithoutArguments.EndsWith(".otf", StringComparison.Ordinal); || sourceWithoutArguments.EndsWith(".otf", StringComparison.OrdinalIgnoreCase);
} }
private static (string fileNameWithoutExtension, string extension) GetFileNameAndExtension( private static (string fileNameWithoutExtension, string extension) GetFileNameAndExtension(

4
src/Avalonia.Base/Media/HslColor.cs

@ -256,7 +256,7 @@ namespace Avalonia.Media
if (workingString.Length >= 11 && if (workingString.Length >= 11 &&
workingString.StartsWith("hsla(", StringComparison.OrdinalIgnoreCase) && workingString.StartsWith("hsla(", StringComparison.OrdinalIgnoreCase) &&
workingString.EndsWith(")", StringComparison.Ordinal)) workingString.EndsWith(')'))
{ {
workingString = workingString.Substring(5, workingString.Length - 6); workingString = workingString.Substring(5, workingString.Length - 6);
prefixMatched = true; prefixMatched = true;
@ -265,7 +265,7 @@ namespace Avalonia.Media
if (prefixMatched == false && if (prefixMatched == false &&
workingString.Length >= 10 && workingString.Length >= 10 &&
workingString.StartsWith("hsl(", StringComparison.OrdinalIgnoreCase) && workingString.StartsWith("hsl(", StringComparison.OrdinalIgnoreCase) &&
workingString.EndsWith(")", StringComparison.Ordinal)) workingString.EndsWith(')'))
{ {
workingString = workingString.Substring(4, workingString.Length - 5); workingString = workingString.Substring(4, workingString.Length - 5);
prefixMatched = true; prefixMatched = true;

4
src/Avalonia.Base/RelativePoint.cs

@ -164,9 +164,9 @@ namespace Avalonia
var unit = RelativeUnit.Absolute; var unit = RelativeUnit.Absolute;
var scale = 1.0; var scale = 1.0;
if (x.EndsWith("%")) if (x.EndsWith('%'))
{ {
if (!y.EndsWith("%")) if (!y.EndsWith('%'))
{ {
throw new FormatException("If one coordinate is relative, both must be."); throw new FormatException("If one coordinate is relative, both must be.");
} }

1
src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj

@ -118,6 +118,7 @@
<Compile Include="..\Avalonia.Base\Metadata\NullableAttributes.cs" Link="NullableAttributes.cs" /> <Compile Include="..\Avalonia.Base\Metadata\NullableAttributes.cs" Link="NullableAttributes.cs" />
<Compile Include="..\Avalonia.Base\Compatibility\TrimmingAttributes.cs" Link="TrimmingAttributes.cs" Visible="False" /> <Compile Include="..\Avalonia.Base\Compatibility\TrimmingAttributes.cs" Link="TrimmingAttributes.cs" Visible="False" />
<Compile Include="..\Avalonia.Base\Utilities\SpanHelpers.cs" Link="Utilities\SpanHelpers.cs" /> <Compile Include="..\Avalonia.Base\Utilities\SpanHelpers.cs" Link="Utilities\SpanHelpers.cs" />
<Compile Include="..\Shared\StringCompatibilityExtensions.cs" Link="Compatibility\StringCompatibilityExtensions.cs" />
<Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\**\obj\**\*.cs" /> <Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\**\obj\**\*.cs" />
<Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\src\XamlX\IL\SreTypeSystem.cs" /> <Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\src\XamlX\IL\SreTypeSystem.cs" />
<PackageReference Include="Mono.Cecil" Version="0.11.5" /> <PackageReference Include="Mono.Cecil" Version="0.11.5" />

7
src/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cs

@ -88,7 +88,10 @@ namespace Avalonia.Build.Tasks
foreach (var s in sources.ToArray()) foreach (var s in sources.ToArray())
{ {
if (s.Path.ToLowerInvariant().EndsWith(".xaml") || s.Path.ToLowerInvariant().EndsWith(".paml") || s.Path.ToLowerInvariant().EndsWith(".axaml")) var path = s.Path;
if (path.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)
|| path.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase)
|| path.EndsWith(".paml", StringComparison.OrdinalIgnoreCase) )
{ {
XamlFileInfo info; XamlFileInfo info;
try try
@ -110,7 +113,7 @@ namespace Avalonia.Build.Tasks
$"Duplicate x:Class directive, {info.XClass} is already used in {typeToXamlIndex[info.XClass]}"); $"Duplicate x:Class directive, {info.XClass} is already used in {typeToXamlIndex[info.XClass]}");
return false; return false;
} }
typeToXamlIndex[info.XClass] = s.Path; typeToXamlIndex[info.XClass] = path;
} }
} }
} }

14
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs

@ -23,11 +23,15 @@ namespace Avalonia.Build.Tasks
public static partial class XamlCompilerTaskExecutor public static partial class XamlCompilerTaskExecutor
{ {
private const string CompiledAvaloniaXamlNamespace = "CompiledAvaloniaXaml"; private const string CompiledAvaloniaXamlNamespace = "CompiledAvaloniaXaml";
static bool CheckXamlName(IResource r) => r.Name.ToLowerInvariant().EndsWith(".xaml") static bool CheckXamlName(IResource r)
|| r.Name.ToLowerInvariant().EndsWith(".paml") {
|| r.Name.ToLowerInvariant().EndsWith(".axaml"); var name = r.Name;
return name.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)
|| name.EndsWith(".xaml",StringComparison.OrdinalIgnoreCase)
|| name.EndsWith(".paml", StringComparison.OrdinalIgnoreCase);
}
public class CompileResult public class CompileResult
{ {
public bool Success { get; set; } public bool Success { get; set; }

4
src/Shared/StringCompatibilityExtensions.cs

@ -8,5 +8,9 @@ internal static class StringCompatibilityExtensions
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool Contains(this string str, char search) => public static bool Contains(this string str, char search) =>
str.Contains(search.ToString()); str.Contains(search.ToString());
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool EndsWith(this string str, char search) =>
str.Length > 0 && str[str.Length - 1] == search;
} }
#endif #endif

9
src/tools/Avalonia.Generators/NameGenerator/AvaloniaNameGenerator.cs

@ -36,10 +36,11 @@ internal class AvaloniaNameGenerator : INameGenerator
{ {
var resolveViews = var resolveViews =
from file in additionalFiles from file in additionalFiles
where (file.Path.EndsWith(".xaml") || let filePath = file.Path
file.Path.EndsWith(".paml") || where (filePath.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase) ||
file.Path.EndsWith(".axaml")) && filePath.EndsWith(".paml", StringComparison.OrdinalIgnoreCase) ||
_pathPattern.Matches(file.Path) filePath.EndsWith(".axaml", StringComparison.OrdinalIgnoreCase)) &&
_pathPattern.Matches(filePath)
let xaml = file.GetText(cancellationToken)?.ToString() let xaml = file.GetText(cancellationToken)?.ToString()
where xaml != null where xaml != null
let view = _classes.ResolveView(xaml) let view = _classes.ResolveView(xaml)

2
src/tools/DevGenerators/CompositionGenerator/CompositionRoslynGenerator.cs

@ -10,7 +10,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator
public void Initialize(IncrementalGeneratorInitializationContext context) public void Initialize(IncrementalGeneratorInitializationContext context)
{ {
var schema = var schema =
context.AdditionalTextsProvider.Where(static file => file.Path.EndsWith("composition-schema.xml")); context.AdditionalTextsProvider.Where(static file => file.Path.EndsWith("composition-schema.xml", System.StringComparison.OrdinalIgnoreCase));
var configs = schema.Select((t, _) => t.GetText()) var configs = schema.Select((t, _) => t.GetText())
.Where(source => source is not null) .Where(source => source is not null)
.Select((source, _) => (GConfig)new XmlSerializer(typeof(GConfig)).Deserialize(new StringReader(source!.ToString()))); .Select((source, _) => (GConfig)new XmlSerializer(typeof(GConfig)).Deserialize(new StringReader(source!.ToString())));

Loading…
Cancel
Save