找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 544|回复: 8

怎么计算汇编指令的执行时间?

[复制链接]
发表于 2024-2-26 08:42:34 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
比如说下面2段汇编指令, 如何从理论上论证,哪个执行的周期断?

1:
    movzx eax, WORD Ptr [esp + 0x6]  '' 0FB74424 06
    retn  0x4

2:
    mov  eax, DWORD Ptr [esp + 0x4]   '' 8B4424 04
    Shr  eax, 0x10                    '' C1E8 10
    retn 0x4

回复

使用道具 举报

发表于 2024-2-26 10:09:46 | 显示全部楼层
论证不了。

不同 CPU 架构的流水线处理方式不一样,以及对于相同的指令,不同 CPU 架构执行该指令所需周期不一样。

这些指令前面如果有前置的指令,那么这些前置的指令会对这些指令的实际执行产生影响,比如指令屏障是否存在等。

唯一可以明确的是你提出的第二个例子的指令数量多一条、总的指令字节数多一些,CPU 在内部转换 μ码 的时候存在耗时差异,但是因为实际的 μ码的执行情况会有更大的耗时差异,最终结论还是无法明确的。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2024-2-26 12:14:50 | 显示全部楼层
谢谢! 那只好作死跑循环 测试下哪个快。。。 哈哈
回复 赞! 靠!

使用道具 举报

发表于 2024-2-26 16:51:13 | 显示全部楼层
tlwh163 发表于 2024-2-26 12:14
谢谢! 那只好作死跑循环 测试下哪个快。。。 哈哈

这样做是行不通的,你的代码在某个项目里跑死循环测出来 1 快 2 慢,可能换一个项目就会变成 2 快 1 慢。

正确做法是优先考虑算法优化,然后再考虑硬件设备相关的优化,最后才是汇编指令优化。
回复 赞! 靠!

使用道具 举报

发表于 2024-2-26 17:06:42 | 显示全部楼层
计算指令执行速度用rdtsc,执行速度分首次执行和循环执行,两者是有差别的
回复 赞! 靠!

使用道具 举报

发表于 2024-2-27 16:20:32 | 显示全部楼层
AyalaRs 发表于 2024-2-26 17:06
计算指令执行速度用rdtsc,执行速度分首次执行和循环执行,两者是有差别的
...


而且测速时必须锁定使用的 CPU 的特定某个核心才可以,因为不同的 CPU 核心的 tsc 计数是从不同的时间开始的,而 Windows/Linux 等现代操作系统会使用不同的 CPU 核心轮流执行你的程序代码。所以在 Windows 上可以使用以下 API 来指定你要使用的具体的 CPU 核心:

DWORD_PTR SetThreadAffinityMask(
  [in] HANDLE    hThread,
  [in] DWORD_PTR dwThreadAffinityMask
);
https://learn.microsoft.com/en-u ... tthreadaffinitymask

回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2024-2-27 19:03:39 | 显示全部楼层
本帖最后由 tlwh163 于 2024-2-27 19:06 编辑

ASM
    rdtsc
    push eax
    ....
    rdtsc
    pop edx
    sub eax, edx
    retn
End Asm


是这个样子?
试了下 中间有几条比较简单的指令 得到的结果是 24 。。。

挺稳定的 执行了几次都是24
回复 赞! 靠!

使用道具 举报

发表于 2024-2-27 23:49:22 | 显示全部楼层
tlwh163 发表于 2024-2-27 19:03
ASM
    rdtsc
    push eax

要先序列化流水线(比如用mfence指令),确保流水线上没有别的指令在执行。
然后rdtsc取开始的tsc,再用rdtscp取结束的tsc。
这是因为rdtsc是直接在rdtsc开始时读取tsc,而rdtscp是等到流水线上在它之前的所有指令完成后才读取tsc。
此外还有考虑供电问题,部分处理器会在低频甚至停转的时候仍然以原速率(即Tsc-Invariant)增加TSC。
更不用提不同处理器拥有不同设计的流水线了。
就算尽可能排除干扰项,它也还只能是测个大概,别太纠结

回复 赞! 靠!

使用道具 举报

发表于 2024-2-29 15:27:23 | 显示全部楼层
tangptr@126.com 发表于 2024-2-27 23:49
[md]
要先序列化流水线(比如用`mfence`指令),确保流水线上没有别的指令在执行。
然后`rdtsc`取开始的t ...

以前测试过,单次执行时rdtscp比较可靠,循环执行时同指令的tsc在同工艺不同处理器的数值是一致的,用rdtsc和rdtscp的差值也是固定的,tsc在虚拟机是不准的
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-10-8 15:55 , Processed in 0.032176 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表