当前位置: 首页 > news >正文

热 综合-网站正在建设中-手机版皮肤自做头像的网站

热 综合-网站正在建设中-手机版,皮肤自做头像的网站,制作网站的顺序,php网站代做这些方法在.NET7 中变得更快照片来自 CHUTTERSNAP[1] 的 Unsplash[2]欢迎阅读.NET 性能系列的第一章。这一系列的特点是对.NET 世界中许多不同的主题进行研究、比较性能。正如标题所说的那样#xff0c;本章节在于.NET7 中的性能改进。你将看到哪种方法是实现特定功能最快的方…这些方法在.NET7 中变得更快照片来自 CHUTTERSNAP[1] 的 Unsplash[2]欢迎阅读.NET 性能系列的第一章。这一系列的特点是对.NET 世界中许多不同的主题进行研究、比较性能。正如标题所说的那样本章节在于.NET7 中的性能改进。你将看到哪种方法是实现特定功能最快的方法以及大量的技巧和敲门如何付出较小的代价就能最大化你代码性能。如果你对这些主题感兴趣那请您继续关注。.NET 7 目前17.10.2022处于预览阶段将于 2022 年 11 月发布。通过这个新版本微软提供了一些大的性能改进。这篇 .NET 性能系列的第一篇文章是关于从.NET6 到.NET7 最值得注意的性能改进。LINQ最相关的改进肯定是在 LINQ 中在.NET 7 中dotnet 社区[3]利用 LINQ 中对数字数组的处理来使用VectorT(SIMD)。这大大改善了一些 LINQ 方法性能你可以在Listint或int[]以及其他数字集合上调用。现在 LINQ 方法也能直接访问底层数组而不是使用枚举器访问。让我们来看看这些方法相对于.NET 6 是如何表现的。我使用BenchmarkDotNet[4]来比较.NET6 和.NET7 相同代码的性能。1. Min 和 Max 方法首先是 LINQ 方法Min()和Max()。它们被用来识别数字枚举中的最低值或最高值。新的实现特别要求有一个先前枚举的集合作为源因此我们必须在这个基准测试中创建一个数组。[Params(1000)] public int Length { get; set; }private int[] arr;[GlobalSetup] public void GlobalSetup()  arr  Enumerable.Range(0, Length).ToArray();[Benchmark] public int Min()  arr.Min();[Benchmark] public int Max()  arr.Max();在.NET 6 和.NET 7 上执行这些基准在我的机器上会得出以下结果。方法运行时数组长度平均值比率分配Min10003,494.08 ns53.2432 BMin100065.64 ns1.00-Max10003,025.41 ns45.9232 BMax100065.93 ns1.00-这里非常突出的是新的.NET7 所展示的性能改进有多大。我们可以看到与.NET 6 相比改进幅度超过 4500%。这不仅是因为在内部实现中使用了另一种类型而且还因为不再发生额外的堆内存分配。2. Average 和 Sum另一个很大的改进是Average()和Sum()方法。当处理大的double集合时这些性能优化能展现出更好的结果这就是为什么我们要用一个double[]来测试它们。[Params(1000)] public int Length { get; set; }private double[] arr;[GlobalSetup] public void GlobalSetup() {var random  new Random();arr  Enumerable.Range(0, Length).Select(_  random.NextDouble()).ToArray(); }[Benchmark] public double Average()  arr.Average();[Benchmark] public double Sum()  arr.Sum();结果显示性能显著提高了 500%以上而且同样没有了内存分配方法运行时数组长度平均值比率分配Average10003,438.0 ns5.5032 BAverage1000630.3 ns1.00-Sum10003,303.8 ns5.2532 BSum1000629.3 ns1.00-这里的性能提升并不像前面的例子那么突出但还是非常高的!3. Order接下来是这是新增了两个排序方法Order()和OrderDescending()。当你不想映射到IComparable类型时应该使用新的方法取代.NET7 中旧的OrderBy()和OrderByDescending()方法。[Params(1000)] public int Length { get; set; }private double[] arr;[GlobalSetup] public void GlobalSetup() {var random  new Random();arr  Enumerable.Range(0, Length).Select(_  random.NextDouble()).ToArray(); }[Benchmark] public double[] OrderBy()  arr.OrderBy(d  d).ToArray();#if NET7_0 [Benchmark] public double[] Order()  arr.Order().ToArray(); #endif方法数组长度平均值风波无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);方法运行时平均值比率分配WriteAllText193.50 μs1.0310016 BWriteAllText187.32 μs1.00464 BReadAllText23.29 μs1.0824248 BReadAllText21.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例子中你不会看到很大的提升。方法运行时平均值比率分配分配比率Default135.4 ns1.04208 B3.71CachedOptions145.9 ns1.12208 B3.71NoCachedOptions90,069.7 ns691.897718 B137.82Default130.2 ns1.0056 B1.00CachedOptions129.8 ns0.9956 B1.00NoCachedOptions533.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;方法运行时平均值比率GuidEquals1.808 ns1.49GuidEquals1.213 ns1.00可以感觉到新的实现也使用了 SIMD比旧的实现快 30%左右。由于有大量的 API 使用Guid作为实体的标识符这肯定会积极的产生影响。2. BigInt 解析一个很大的改进发生在将巨大的数字从字符串解析为BigInteger类型。就我个人而言在一些区块链项目中我曾使用过BigInteger类型在那里有必要使用这种类型来表示 ETH 代币的精度。所以在性能方面这对我来说会很方便。private string bigIntString  string.Concat(Enumerable.Repeat(123456789, 100000));[Benchmark] public BigInteger ParseBigInt()  BigInteger.Parse(bigIntString);方法运行时平均值比率分配ParseBigInt2.058 s1.622.09 MBParseBigInt1.268 s1.002.47 MB我们可以看到性能有了明显的提高不过我们也看到它比.NET6 上多分配一些内存。3. Boolean 解析对于解析boolean类型我们也有显著的性能改进[Benchmark] public bool ParseBool()  bool.TryParse(True, out _);方法运行时平均值比率ParseBool8.164 ns5.21ParseBool1.590 ns1.00诊断System.Diagnostics命名空间也进行了升级。进程处理有两个重大改进Stopwatch有一个新功能。1. GetProcessByName[Benchmark] public Process[] GetProcessByName() Process.GetProcessesByName(dotnet.exe);方法运行时平均值比率分配分配比率GetProcessByName2.065 ms1.04529.89 KB247.31GetProcessByName1.989 ms1.002.14 KB1.00新的GetProcessByName()的速度并不明显但使用的分配内存比前者少得多。2. GetCurrentProcessName[Benchmark] public string GetCurrentProcessName() Process.GetCurrentProcess().ProcessName;方法运行时平均值比率分配分配比率GetCurrentProcessName1,955.67 μs103.023185 B6.98GetCurrentProcessName18.98 μs1.00456 B1.00在这里我们可以看到一个更有效的内存方法对.NET 7 的实现有极高的性能提升。3. StopwatchStopwatch被广泛用于测量运行时的性能。到目前为止存在的问题是使用Stopwatch需要分配堆内存。为了解决这个问题dotnet 社区实现了一个静态函数GetTimestamp()它仍然需要一个复杂的逻辑来有效地获得时间差。现在又实现了另一个静态方法名为GetElapsedTime()在这里你可以传递之前的时间戳并在不分配堆内存的情况下获得经过的时间。[Benchmark(Baseline  true)] public TimeSpan OldStopwatch() {Stopwatch sw  Stopwatch.StartNew();return sw.Elapsed; }[Benchmark] public TimeSpan NewStopwatch() {long timestamp  Stopwatch.GetTimestamp();return Stopwatch.GetElapsedTime(timestamp); }MethodMeanRatioAllocatedAlloc RatioOldStopwatch39.44 ns1.0040 B1.00NewStopwatch37.13 ns0.94-0.00这种方法的速度优化并不明显然而节省堆内存分配可以说是值得的。结尾我希望我可以在性能和基准测试的世界里给你一个有趣的切入点。如果你关于特定性能主题想法请在评论中告诉我。如果你喜欢这个系列的文章请务必关注我因为还有很多有趣的话题等着你。谢谢你的阅读!版权原文版权Tobias Streng翻译版权InCerry 原文链接 https://medium.com/tobias.streng/net-performance-series-1-performance-improvements-in-net-7-fb793f8f5f71参考资料[1] CHUTTERSNAP: https://unsplash.com/chuttersnap?utm_sourcemediumutm_mediumreferral[2] Unsplash: https://unsplash.com/?utm_sourcemediumutm_mediumreferral[3] dotnet社区: https://github.com/microsoft/dotnet[4] BenchmarkDotNet: https://benchmarkdotnet.org/articles/overview.html
http://www.zqtcl.cn/news/312508/

相关文章:

  • 登录建设官方网站品牌营销专家
  • 天津模板建站哪家好wordpress标题换行显示不全
  • 杭州房地产网站建设网站建设开发公司推荐指数
  • 建设部网站上怎样查询企业业绩做淘宝联盟网站要多少钱
  • 宣武上海网站建设网站导购话术
  • 天津北京网站建设公司大网站建设公司
  • 网站需要在哪些方面备案百度云建网站
  • 西安手机网站定制网站建设西安网站注册
  • 怎么做秒赞网站企业自己建设的营销网络
  • 一般网站建设需求有哪些wordpress脚注更改
  • 海报设计在线生成免费网站排名优化方案
  • 网站开发综合设计报告怎么制作浏览器网页
  • 做网站打广告青岛网站营销推广
  • 网站建设中首页模板本科 网站建设的基础教程
  • 推广网站优化seo教程上排名抖音营销
  • 创业园区网站建设wordpress对接公众号源码
  • 怎么设计公司的网站长沙seo结算
  • 参加网站建设项目人员保障体系镇江网站建设门户报价
  • 漯河网站优化景区网站建设方案
  • 辽宁智能网站建设价位wordpress 公司主题
  • zencart 网站入侵冲电气软件 网站建设
  • 在网上做黑彩网站会怎样wordpress自定义代码在哪里设置
  • 福州营销网站建设老品牌网站开通
  • 电子商务网站体系结构有哪些?网站开发规划书怎么写
  • 建设一个网站要多少钱建设银行信用卡卡网站首页
  • 百度推广效果怎样seo网上培训课程
  • 广州品牌网站建设 优美wordpress 跳转页面
  • 成都专业的网站建设制作公司哪家好m3u8视频可以永久保存吗
  • 上海做兼职的网站如何在凡科建设网站
  • 沙朗镇做网站公司企业管理咨询师是干什么的