.NET性能系列文章一:.NET7的性能改进( 二 )

方法数组长度平均值分配OrderBy100051.13 μs27.61 KBOrder100050.82 μs19.77 KB在这个基准中 , 只使用了.NET 7,因为Order()方法在旧的运行时中不可用 。
我们无法看到这两种方法之间的性能影响 。然而 , 我们可以看到的是在堆内存分配方面有很大的改进 , 这将显著减少垃圾收集 , 从而节省一些GC时间 。
System.IO在.NET 7中,Windows下的IO性能有了些许改善 。WriteAllText()方法不再使用那么多分配的内存,ReadAllText()方法与.NET 6相比也快了一些 。
[Benchmark]public void WriteAllText() => File.WriteAllText(path1, content);[Benchmark]public string ReadAllText() => File.ReadAllText(path2);方法运行时平均值比率分配WriteAllText

.NET性能系列文章一:.NET7的性能改进

文章插图
193.50 μs1.0310016 BWriteAllText
.NET性能系列文章一:.NET7的性能改进

文章插图
187.32 μs1.00464 BReadAllText
.NET性能系列文章一:.NET7的性能改进

文章插图
23.29 μs1.0824248 BReadAllText
.NET性能系列文章一:.NET7的性能改进

文章插图
21.53 μs1.0024248 B序列化 (System.Text.Json)来自System.Text.Json命名空间的JsonSerializer得到了一个小小的升级,一些使用了反射的自定义处理程序会在幕后为你缓存,即使你初始化一个JsonSerialzierOptions的新实例 。
private JsonSerializerOptions options = new JsonSerializerOptions();private TestClass instance = new TestClass("Test");[Benchmark(Baseline = true)]public string Default() => JsonSerializer.Serialize(instance);[Benchmark]public string CachedOptions() => JsonSerializer.Serialize(instance, options);[Benchmark]public string NoCachedOptions() => JsonSerializer.Serialize(instance, new JsonSerializerOptions());public record TestClass(string Test);在上面代码中 , 对NoCachedOptions()的调用通常会导致JsonSerialzierOptions的额外实例化和一些自动生成的处理程序 。在.NET 7中这些实例是被缓存的,当你在代码中使用这种方法时,你的性能会好一些 。否则,无论如何都要缓存你的JsonSerialzierOptions , 就像在CachedOptions例子中,你不会看到很大的提升 。
方法运行时平均值比率分配分配比率Default
.NET性能系列文章一:.NET7的性能改进

文章插图
135.4 ns1.04208 B3.71CachedOptions
.NET性能系列文章一:.NET7的性能改进

文章插图
145.9 ns1.12208 B3.71NoCachedOptions
.NET性能系列文章一:.NET7的性能改进

文章插图
90,069.7 ns691.897718 B137.82Default
.NET性能系列文章一:.NET7的性能改进

文章插图
130.2 ns1.0056 B1.00CachedOptions
.NET性能系列文章一:.NET7的性能改进

文章插图
129.8 ns0.9956 B1.00NoCachedOptions
.NET性能系列文章一:.NET7的性能改进

文章插图
533.8 ns4.10345 B6.16基本类型1. Guid 相等比较有一项改进,肯定会导致现代应用程序的性能大增 , 那就是对Guid相等比较的新实现 。
private Guid guid0 = Guid.Parse("18a2c952-2920-4750-844b-2007cb6fd42d");private Guid guid1 = Guid.Parse("18a2c952-2920-4750-844b-2007cb6fd42d");[Benchmark]public bool GuidEquals() => guid0 == guid1;方法运行时平均值比率GuidEquals
.NET性能系列文章一:.NET7的性能改进

文章插图
1.808 ns1.49GuidEquals
.NET性能系列文章一:.NET7的性能改进

文章插图
1.213 ns1.00可以感觉到,新的实现也使用了SIMD , 比旧的实现快30%左右 。
.NET性能系列文章一:.NET7的性能改进

文章插图
由于有大量的API使用Guid作为实体的标识符,这肯定会积极的产生影响 。
2. BigInt 解析一个很大的改进发生在将巨大的数字从字符串解析为BigInteger类型 。就我个人而言,在一些区块链项目中,我曾使用过BigInteger类型,在那里有必要使用这种类型来表示ETH代币的精度 。所以在性能方面,这对我来说会很方便 。
private string bigIntString = string.Concat(Enumerable.Repeat("123456789", 100000));[Benchmark]public BigInteger ParseBigInt() => BigInteger.Parse(bigIntString);方法运行时平均值比率分配ParseBigInt
.NET性能系列文章一:.NET7的性能改进

推荐阅读