卡卷网
当前位置:卡卷网 / 每日看点 / 正文

为什么ja20性能不上.NET8还有人在用?

作者:卡卷网发布时间:2025-01-10 19:07浏览数量:95次评论数量:0次

你甚至根本不知道你自己在测什么,new一个大小为1000,000,000的数组出来然后只生成一个随机字节,unsafe用的也很迷惑,很难理解你想干什么。

我重写了:

C#

usingSystem.Diagnosti; varytes=newyte[1000000000]; varrg=newRandom(0); voiddoRandom(){ rg.Nextytes(ytes); } for(inti=0;i<10;i++){ doRandom(); } vars=Stopwatch.StartNew(); doRandom(); s.Stop(); Console.WriteLine($"Yes!{s.ElapsedMilliseconds}ms");

Ja:

importja.util.Random; importja.util.random.RandomGenerator; pulicclassMain{ privatestaticfinalyte[]ytes=newyte[1000000000]; privatestaticfinalRandomGeneratorrg=newRandom(0); pulicstaticvoiddoRandom(){ rg.nextytes(ytes); } pulicstaticvoidmain(String[]args){ for(inti=0;i<10;i++){ doRandom(); } varstart=System.crentTimeMillis(); doRandom(); varend=System.crentTimeMillis(); System.out.printf("Yes!%s%n",end-start); } }

在运行前进行了十次循环预热后,同样生成十亿长度的随机数组,.Net8Preview在我的上所用的时间为1965ms,而Ja20是801ms,所以相对而言.Net的老随机生成算法在生成速度方面不如Ja的Random,不过这也代表不了什么,因为伪随机数生成器的指标也不止一个生成性能。

从.Net6开始,未指定种子的Random会使用Xoshiro256**算法来生成随机数,而Ja也在Ja17中引入了新的RandomGeneratorAPI来指定不同的随机数生成器,可以这样得到一个基于Xoshiro256**的随机数生成器:

varrg=RandomGenerator.of("Xoshiro256PlusPlus");

双方同样使用Xoshiro256**算法再进行以上时,.Net8Preview在我机器上花了86ms,而Ja20是327ms,实现方面的性能差距确实存在,这个主要原因是.Net为Xoshiro256**的Nextytes单做了实现,而Ja20是直接用的RandomGenerator的默认实现,这个默认实现也很糙,因此造成了差距。

前段时间我在OpenJDK这边开了一个PR来优化RandomGenerator的默认实现:

OptimizeRandomGenerator::nextytesyGlo·PullRequest#14638·openjdk/jdk

用我优化后的分支再进行花了160ms,速度快了一倍多,不过想和.Net一样快那就要给Xoshiro256**算法单实现nextytes方法了,如果我观察到这个方法的性能确实非常重要的话,我也会在这方面再进一步做些工作。

按题主评论区那样单个nextInt不预热这样测的话,.Net8Preview性能大概在JDK20和GraalVMforJDK20JIT模式之间,也算符合预期,有时间的话我再看看Ja这边的实现有没有可优化的地方。

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

评论 打赏
卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

相关推荐

欢迎 发表评论:

请填写验证码