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


.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的性能改进

文章插图
2.058 s1.622.09 MBParseBigInt
.NET性能系列文章一:.NET7的性能改进

文章插图
1.268 s1.002.47 MB
.NET性能系列文章一:.NET7的性能改进

文章插图
我们可以看到性能有了明显的提高,不过我们也看到它比.NET6上多分配一些内存 。
3. Boolean 解析对于解析boolean类型,我们也有显著的性能改进:
[Benchmark]public bool ParseBool() => bool.TryParse("True", out _);方法运行时平均值比率ParseBool
.NET性能系列文章一:.NET7的性能改进

文章插图
8.164 ns5.21ParseBool
.NET性能系列文章一:.NET7的性能改进

文章插图
1.590 ns1.00
.NET性能系列文章一:.NET7的性能改进

文章插图
诊断System.Diagnostics命名空间也进行了升级 。进程处理有两个重大改进,Stopwatch有一个新功能 。
1. GetProcessByName[Benchmark]public Process[] GetProcessByName()=> Process.GetProcessesByName("dotnet.exe");方法运行时平均值比率分配分配比率GetProcessByName
.NET性能系列文章一:.NET7的性能改进

文章插图
2.065 ms1.04529.89 KB247.31GetProcessByName
.NET性能系列文章一:.NET7的性能改进

文章插图
1.989 ms1.002.14 KB1.00新的GetProcessByName()的速度并不明显,但使用的分配内存比前者少得多 。
.NET性能系列文章一:.NET7的性能改进

文章插图
2. GetCurrentProcessName[Benchmark]public string GetCurrentProcessName()=> Process.GetCurrentProcess().ProcessName;方法运行时平均值比率分配分配比率GetCurrentProcessName
.NET性能系列文章一:.NET7的性能改进

经验总结扩展阅读