试了一下第二个测试,把java那里的char改成了跟c#一样的int,循环2147483647次,c#确实比java慢点
测试环境:
CPU: i7-8550U
RAM: 16GB
OS: Windows 10 1809 x64
C#:.Net Core 2.1.403 (Windows 10 x64)
Java:openjdk 10.0.2 (Archlinux on WSL)
测试结果:
C#: 385s,384s,386s
java: 189s、187s、188s
看到有人说C#的string.Length性能有问题,于是全改成常量测试,结果:
C#: 227s,227s,226s
Java: 189s、189s、188s
可以看到C#的版本确实快了很多,而Java的基本没啥变化,应该是Java针对这点做了优化, 不过就最终结果而言.NET Core 2.1还是比openjdk 10慢点。
两种语言都是对同样的函数进行多次调用,JIT的策略应该不至于造成近30秒的差距。不过我直接用C++跑的速度反而比C#和Java更慢,但是开优化就会直接删掉循环,所以应该是JIT跑的过程中会把循环给优化掉。
有人提到C#有IL2CPP,所以用第一个算阶乘的例子对比了一下C++的性能(不用第二个例子是因为g++开优化直接把循环给优化没了),测试结果C#还是最慢,用CoreRT进行AOT编译也并不能更快,而Java和C++速度看不出差距。https://gist.github.com/LightMelodies/1d4f0222e2a208dd4ce1331315250cb8gist.github.com