为什么程序不同部分的相同汇编操作(例如mul)会消耗不同的时间?
P.S。我正在使用C ++和反汇编程序。
答案 0 :(得分:5)
这个问题非常模糊,但通常在现代CPU上你不能指望操作有一个恒定的执行时间,因为很多因素会影响这一点,包括但不限于:
答案 1 :(得分:4)
为什么同类操作在现代处理器上具有大幅度变化的性能有各种原因。
数据缓存未命中: 如果您的操作访问内存,它可能会在一个位置转到缓存并在其他位置生成缓存未命中。缓存未命中可以按照hundret周期的顺序进行,而简单的操作通常会在几个周期内执行,因此这会使速度慢得多。
管道档位: 现代CPU通常是流水线的,因此可以在每个周期调度一条指令(或多于一条指令),但它们通常需要多个周期才能获得结果。您的操作可能取决于另一个操作的结果,该操作在计划操作时尚未就绪,因此CPU必须等到产生结果的操作完成。
指令缓存未命中: 指令流也被高速缓存,所以你可能会发现这样一种情况:每次遇到一个位置时,cpu就会产生一个高速缓存未命中(对于任何可能需要大量运行时间的东西,指令高速缓存不是那样)小)。
分支错误预测: 另一种管道失速。 CPU将尝试预测条件跳转将以何种方式进行,并推测性地执行该执行路径中的代码。如果它是错误的,它必须丢弃此推测执行的结果并从另一条路径开始。这可能会显示在探查器中另一条路径的第一行。
资源争用:操作可能不依赖于不可用的结果,但所需的执行单元可能仍然被另一条指令占用(某些指令并非在所有处理器上完全流水线化,或者可能是因为某种超线程或推土机共享FPU)。 CPU可能必须停止,直到设备空闲为止。
Page Faults :应该非常明显。基本上是类固醇的缓存小姐。如果必须从磁盘重新加载所访问的内存,则将花费数十万个周期
... :这个列表还在继续,但上面提到的点是最有可能对我的opionon产生影响的点。
答案 2 :(得分:2)
我假设您询问应用于相同操作数的完全相同的指令。
可能导致巨大性能影响的一个可能原因是操作数是否在CPU缓存中是否可用,或者是否必须从主RAM中获取操作数。
这只是一个例子;还有许多其他潜在的原因。使用现代CPU,通常很难通过查看代码来确定给定指令需要多少个周期。
答案 3 :(得分:1)
- 在分析器中,我看到“mulps%xmm11,%xmm5”,例如。我想这是寄存器中的数据
醇>
xmmXX是SSE指令。 mulps是精确单一的,它取决于你是否将SSE乘法与正常标量乘法进行比较。在这种情况下,这是可以理解的。
我们确实需要更多信息,以便更好地回答一大块asm和你的个人资料。
如果只是这条指令很慢?或者是一块指令,可能是从未对齐的内存中加载,或者是因为缓存未命中,管道危险以及其他大量的可能性。