fix(core): Optimizes strings / .NET 5 compatibility changes (#354)
- [X] Removes some string allocations (e.g. split) - [X] Optimizes some collections - [X] Converts insensitive to extension methods of built-ins. - [X] Adds ordinal (case sensitive) string helpers - [X] Fixes conditionals for in-game commands so they use Ordinal comparisons. - [X] Replaces ToLower.Contains with InsensitiveContains - [X] Adds ValueStringBuilder - [X] Implements ValueStringBuilder in a few places where it makes sense - [X] Removes the redundant Wrap function and replaces it with an optimized version - [X] Fixes list conversions in Utility Closes #351 Bumps release version
This commit is contained in:
parent
92aae8d482
commit
77ce2e1980
117 changed files with 2000 additions and 1226 deletions
|
|
@ -0,0 +1,87 @@
|
|||
using System.Buffers;
|
||||
using System.Text;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Jobs;
|
||||
using Server.Buffers;
|
||||
|
||||
namespace Benchmarks.BenchmarkUtilities
|
||||
{
|
||||
[MemoryDiagnoser]
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp50)]
|
||||
public class BenchmarkStringHelpers
|
||||
{
|
||||
private readonly string[] names =
|
||||
{
|
||||
"Kamron", "Owyn", "Luthius", "Jaedan", "Vorspire", "other people",
|
||||
"Kamron-2", "Owyn-2", "Luthius-2", "Jaedan-2", "Vorspire-2", "other people too"
|
||||
};
|
||||
|
||||
private int length;
|
||||
|
||||
[GlobalSetup]
|
||||
public void Setup()
|
||||
{
|
||||
var chrs = ArrayPool<char>.Shared.Rent(65535);
|
||||
ArrayPool<char>.Shared.Return(chrs);
|
||||
length = 0;
|
||||
|
||||
for (int i = 0; i < names.Length; i++)
|
||||
{
|
||||
length += names.Length;
|
||||
}
|
||||
|
||||
length += 2 * (names.Length - 1) + 3;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public string BenchmarkStringBuilder()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
for (var i = 0; i < names.Length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.Append(i == names.Length - 1 ? ", and" : ", ");
|
||||
}
|
||||
|
||||
sb.Append(names[i]);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public string BenchmarkValueStringBuilderWithStack()
|
||||
{
|
||||
using var sb = new ValueStringBuilder(stackalloc char[length]);
|
||||
for (var i = 0; i < names.Length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.Append(i == names.Length - 1 ? ", and" : ", ");
|
||||
}
|
||||
|
||||
sb.Append(names[i]);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public string BenchmarkValueStringBuilderWithRentedBuffer()
|
||||
{
|
||||
using var sb = new ValueStringBuilder(stackalloc char[32]);
|
||||
for (var i = 0; i < names.Length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.Append(i == names.Length - 1 ? ", and" : ", ");
|
||||
}
|
||||
|
||||
sb.Append(names[i]);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@
|
|||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>9</LangVersion>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<SkipLocalsInitiAttribute>true</SkipLocalsInitiAttribute>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ using Server.Items;
|
|||
|
||||
namespace Benchmarks
|
||||
{
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
|
||||
[SimpleJob(RuntimeMoniker.NetCoreApp50)]
|
||||
public class BenchmarkFeatureFlags
|
||||
{
|
||||
public Dictionary<Type, FeatureFlag<Item>> m_Dictionary;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using BenchmarkDotNet.Running;
|
||||
using Benchmarks.BenchmarkUtilities;
|
||||
|
||||
namespace Benchmarks
|
||||
{
|
||||
|
|
@ -8,7 +9,8 @@ namespace Benchmarks
|
|||
{
|
||||
// var featureFlags = BenchmarkRunner.Run<BenchmarkFeatureFlags>();
|
||||
// var packetConstruction = BenchmarkRunner.Run<BenchmarkPacketConstruction>();
|
||||
var broadcast = BenchmarkRunner.Run<BenchmarkPacketBroadcast>();
|
||||
// var broadcast = BenchmarkRunner.Run<BenchmarkPacketBroadcast>();
|
||||
var stringHelpers = BenchmarkRunner.Run<BenchmarkStringHelpers>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue