我在SO上找到了一些关于<和<=的性能比较的问题(这个问题非常简单),我总能找到相同的答案,即两者之间没有性能差异.
我写了一个比较程序(不是那么工作小提琴......复制到你的机器上运行它),我在其中创建了两个循环for (int i = 0; i <= 1000000000; i++ )和for (int i = 0; i < 1000000001; i++ )两种不同的方法.
我跑了100次方法; 取平均经过的时间,发现<=运算符循环比运算符运行慢<.
我多次运行程序并且<=总是花费更多时间来完成.我的结果(im ms)是:
3018.73,2772.22
2816.87,2760.62
2859.02,2797.05
我的问题是:如果没有一个更快,为什么我看到结果的差异?我的程序有什么问题吗?
Han*_*ant 10
基准测试是一门艺术.您所描述的内容在物理上是不可能的,<=和<运算符只生成以完全相同的速度执行的不同处理器指令.我稍微修改了你的程序,运行DoIt十次并从for()循环中删除两个零,所以我不必等待永远:
x86抖动:
Less Than Equal To Method Time Elapsed: 0.5
Less Than Method Time Elapsed: 0.42
Less Than Equal To Method Time Elapsed: 0.36
Less Than Method Time Elapsed: 0.46
Less Than Equal To Method Time Elapsed: 0.4
Less Than Method Time Elapsed: 0.34
Less Than Equal To Method Time Elapsed: 0.33
Less Than Method Time Elapsed: 0.35
Less Than Equal To Method Time Elapsed: 0.35
Less Than Method Time Elapsed: 0.32
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.32
Less Than Equal To Method Time Elapsed: 0.34
Less Than Method Time Elapsed: 0.32
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.31
Less Than Equal To Method Time Elapsed: 0.34
Less Than Method Time Elapsed: 0.32
Less Than Equal To Method Time Elapsed: 0.31
Less Than Method Time Elapsed: 0.32
Run Code Online (Sandbox Code Playgroud)
x64抖动:
Less Than Equal To Method Time Elapsed: 0.44
Less Than Method Time Elapsed: 0.4
Less Than Equal To Method Time Elapsed: 0.44
Less Than Method Time Elapsed: 0.45
Less Than Equal To Method Time Elapsed: 0.36
Less Than Method Time Elapsed: 0.35
Less Than Equal To Method Time Elapsed: 0.38
Less Than Method Time Elapsed: 0.34
Less Than Equal To Method Time Elapsed: 0.33
Less Than Method Time Elapsed: 0.34
Less Than Equal To Method Time Elapsed: 0.34
Less Than Method Time Elapsed: 0.32
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.35
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.42
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.31
Less Than Equal To Method Time Elapsed: 0.32
Less Than Method Time Elapsed: 0.35
Run Code Online (Sandbox Code Playgroud)
您从中获得的唯一真实信号是第一个DoIt()的执行速度慢,在测试结果中也是可见的,即抖动开销.而最重要的信号,它是嘈杂的.两个环的中值大约相等,标准偏差相当大.
否则,当你进行微优化时,你总会得到那种信号,代码的执行不是很确定.从通常很容易消除的.NET运行时开销来看,您的程序并不是唯一在您的计算机上运行的程序.它必须共享处理器,只是WriteLine()调用已经有影响.由conhost.exe进程执行,与您的测试同时运行,同时您的测试代码进入下一个for()循环.在您的机器,内核代码和中断处理程序上发生的所有其他事情也可以轮到他们.
并且codegen可以发挥作用,例如你应该做的一件事就是交换两个调用.处理器本身通常非常不确定地执行代码.处理器缓存的状态以及分支预测逻辑收集了多少历史数据非常重要.
当我进行基准测试时,我认为15%或更低的差异没有统计学意义.寻找低于此值的差异非常困难,您必须非常仔细地研究机器代码.愚蠢的事情,如分支目标未对齐或变量未存储在处理器寄存器中,可能会对执行时间产生很大影响.不是你可以修复的东西,抖动没有足够的旋钮来调整.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |