- 主题:出乎意料,C++和dotnet6比dotnet5慢10% (转载)
奇怪的是,你这文章有啥关键词触碰了他们敏感的神经?
【 在 finlab 的大作中提到: 】
: 被审核,直接发不出来 ...
--
FROM 223.104.44.*
这个才是根源
c++的 new 向系统申请内存很慢
c#的 new 程序启动时就分配好大匹内存,所以快
【 在 z16166 (Netguy) 的大作中提到: 】
: 我这里测试,c++比.net 5的慢一点点,
: 但是c++把那个new提出来之后,比.net 5的要快一点点。
: 但是c++再把那个new放回原位后,跟.net 5的差不多。
: ...................
--
FROM 221.219.211.*
我感觉是编码的问题,转换成另一种编码正好触碰了关键词,而且现在水木的关键词很
怪,冰hu你说招谁惹谁了
【 在 chenghaibo (chenghaibo) 的大作中提到: 】
: 奇怪的是,你这文章有啥关键词触碰了他们敏感的神经?
--
FROM 124.202.206.*
【 在 finlab 的大作中提到: 】
: 发信人: finlab (挨踢卢瑟), 信区: Programming
: 标 题: 出乎意料,C++和dotnet6比dotnet5慢10%
: 发信站: 水木社区 (Sun Dec 12 11:19:41 2021), 站内
: ...................
说实话,你的这段代码,还是比较简单的,C++ 编译器能做的优化,其实并不比C#的 JIT 做的多
JIT 里面寄存器分配可能为了速度差了一点,但是这个代码没那么复杂,估计也没啥可以减少的溢出
数组边界检查什么的,估计也是JIT的时候分析移除了
这样两个目标代码差不多,速度没有显著差异是正常的
java 界不是早就有很多证据表明简单计算类的代码,java不比c++慢吗?
--
FROM 114.250.179.*
用benchmark.net简单测试了一下
intperf 是你原版c#
CppintperfT 是原版C++,CppintperfT2是老鱼的自称优化了20%的版本
intperfUnsafe 是随手改了一个unsafe的c#
benchmark.net默认大概是6-10次warmup,然后12-15次测试取平均
测试结果见下表。考虑到运算次数,基本上可以认为无明显区别
| Method | Job | Runtime | Mean | Error | StdDev | Ratio |
|-------------- |--------- |--------- |--------:|---------:|---------:|------:|
| intperf | .NET 5.0 | .NET 5.0 | 3.492 s | 0.0007 s | 0.0006 s | 1.00 |
| intperf | .NET 6.0 | .NET 6.0 | 3.505 s | 0.0014 s | 0.0013 s | 1.00 |
| | | | | | | |
| intperfUnsafe | .NET 5.0 | .NET 5.0 | 3.474 s | 0.0007 s | 0.0006 s | 1.00 |
| intperfUnsafe | .NET 6.0 | .NET 6.0 | 3.478 s | 0.0003 s | 0.0002 s | 1.00 |
| | | | | | | |
| CppintperfT | .NET 5.0 | .NET 5.0 | 3.468 s | 0.0007 s | 0.0006 s | 1.00 |
| CppintperfT | .NET 6.0 | .NET 6.0 | 3.467 s | 0.0002 s | 0.0002 s | 1.00 |
| | | | | | | |
| CppintperfT2 | .NET 5.0 | .NET 5.0 | 3.467 s | 0.0006 s | 0.0005 s | 1.00 |
| CppintperfT2 | .NET 6.0 | .NET 6.0 | 3.466 s | 0.0006 s | 0.0005 s | 1.00 |
【 在 finlab 的大作中提到: 】
: 是的, 一般情况下, 这个范围的差异可以忽略。
: 这个测试比较单一。 不过可以推测,大家的浮点数运算也是接近的。
: 相同的运算基本生成相同的代码。
: ...................
--
FROM 123.116.198.*
另外第一次跑的数据,发现老鱼的优化版比原版更慢,差点笑出声
这是又给跑了一次的结果
c++的是vc默认值编译,c# pinvoke调用。pinvoke会额外有几十个时钟周的消耗,但这个应该体现不到结果中
--
FROM 123.116.198.*
avx 等没有除法,优化不了,这个算法只能做partition然后靠cpu或gpu堆,写起来相当麻烦,一没留神就比不优化更慢
【 在 hgoldfish 的大作中提到: 】
: 对。。我猜会稍微快一点的原因是一次性加载四个 int 到四个寄存器里面,能把流水线填得满一点?
: 如果 int % 操作能够用 avx 指令并行化的话,速度是不是可以更快一些?可惜我不太懂得这个怎么用 avx SIMD 并行化。
:
--
FROM 123.116.198.*
后端服务器都有公认techempower的benchmark,别自己瞎主观推测
【 在 hgoldfish 的大作中提到: 】
: c# 和 java 的计算代码本来就不慢。java 还需要 jit 预热,c# 在编译的时候听说可以直接编译到 native
: 或许你再试试,c# 里不用 int[] 而是 vector<> ,并且改成从外部传进来。对于稍复杂的对象,c# 这种虚拟机语言存取内存的低效就能看出来了。
: 如果是 io 代码,更容易看出虚拟机语言的问题。一是虚拟机语言的序列化低效,二是虚拟机语言占用的内存偏多。所以用 cpp/go 写后端服务器,正常都会比 java/c# 快且省内存。
: ...................
--
FROM 123.116.198.*
...
哭了
【 在 leadu 的大作中提到: 】
: 另外第一次跑的数据,发现老鱼的优化版比原版更慢,差点笑出声
: 这是又给跑了一次的结果
: c++的是vc默认值编译,c# pinvoke调用。pinvoke会额外有几十个时钟周的消耗,但这个应该体现不到结果中
--
FROM 180.158.21.*
有除法的啊。但没有求 mod 的。
mm256_div_pd
【 在 leadu (leadu) 的大作中提到: 】
: avx 等没有除法,优化不了,这个算法只能做partition然后靠cpu或gpu堆,写起来相当麻烦,一没留神就比不优化更慢
--
FROM 124.72.118.*