汇编操作的时间
time of an assembler operation
为什么相同的汇编操作(例如多)在程序的不同部分会消耗不同的时间?
注:我使用c++和反汇编器
这个问题非常模糊,但通常在现代CPU上,您不能期望操作具有恒定的执行时间,因为很多因素会影响这一点,包括但不限于:
- 分支预测失败 <
- 缓存未命中/gh>
- 流水线
- …
同一种操作在现代处理器上的性能差异很大有各种各样的原因。
数据缓存失败:如果您的操作访问内存,它可能会进入一个位置的缓存,并在其他位置生成缓存缺失。缓存丢失可能在一百个周期的顺序,而简单的操作通常在几个周期内执行,所以这将使它慢得多。
管道摊位:现代cpu通常是流水线的,因此每个周期可以调度一条(或多条)指令,但是它们通常需要多个周期才能获得结果。您的操作可能依赖于另一个操作的结果,而该操作在调度操作时尚未准备好,因此CPU必须等待,直到生成结果的操作完成。
指令缓存失败:指令流也被缓存,所以你可能会发现cpu每次遇到一个位置都会产生缓存缺失的情况(不太可能发生任何会占用大量运行时的事情,指令缓存不是那么小)。
说明:另一种管道失速。CPU将尝试预测条件跳转的方向,并推测执行该执行路径中的代码。如果它是错误的,它必须放弃这种推测执行的结果,并开始另一条道路。这可能显示在分析器中其他路径的第一行。
资源争用:操作可能不依赖于不可用的结果,但所需的执行单元可能仍然被另一条指令占用(有些指令在所有处理器上没有完全流水线,或者可能是因为某种超线程或推土机共享FPU)。同样,CPU可能不得不停止运行,直到单元空闲为止。
页面错误:应该是相当明显的。基本上就是打了兴奋剂的Cache Miss。如果访问的内存必须从磁盘重新加载,这将花费数十万个周期
…:这样的例子不胜枚举,但上述几点是最有可能对我的选择产生影响的。
我想你问的是对相同操作数应用的完全相同的指令。
一个可能对性能产生巨大影响的原因是操作数是否在CPU缓存中随时可用,或者是否必须从主RAM中获取。
这只是一个例子;还有许多其他潜在的原因。在现代cpu中,通常很难通过查看代码来计算给定指令需要多少个周期。
例如,在分析器中,我看到"mulps %xmm11, %xmm5"。我猜是寄存器中的数据
xmmXX是SSE指令。mulps是精确单倍数,它取决于您是否将SSE乘法与普通标量乘法进行比较。在这种情况下是可以理解的。
我们真的需要更多的信息来更好地回答asm和你的分析器的数据。
如果只是这条指令是慢的?或者是一个指令块,可能是从未对齐的内存加载,或者你得到缓存丢失,管道危险和大量其他可能性。
- C++为构建时间获取QDateTime的可靠方法
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- 以毫秒级精度对日期和时间进行操作
- 如何计划在将来时间运行的操作
- 程序执行基本操作所花费的总时间
- 从长时间中提取每个单词的钻头操作
- std::list c++是连续的,那么在序列中的任何位置插入和擦除操作都需要恒定的时间
- 如何使生成的线程拖延足够长的时间以使生成线程执行某些操作
- 在 QThread 中运行长时间操作并将信号发送到主线程仍会冻结 UI
- 在C++中的代码中指定的某个等待时间后执行某个操作
- 测试一个操作在Qt中花费多少时间的最简单方法
- 汇编操作的时间
- 具有c++标准规定的时间复杂度的操作能否动态分配内存?
- 是否有一种可编程的方法来估计CPU执行fp操作所需的时间
- Boost:如何处理依赖于时间的线程操作
- 具有常数时间操作的数据结构
- 为什么ctime clock()在同一个程序对同一个操作调用两次时给出不同的时间?
- 获取当前线程id的操作时间昂贵
- 计算c++中操作之间的时间长度
- std::vector<void*>::保留 O(1) 时间操作的参数是什么?