首页
社区
课程
招聘
[求助]为什么2次运行时间差异这么大?
2023-5-18 11:35 5051

[求助]为什么2次运行时间差异这么大?

2023-5-18 11:35
5051

为什么if里的数据改变了,两句mov eax, NOP,mov al, byte ptr[eax]
指令花费的时间变了80个时钟周期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<intrin.h>
int main(int argc, char** argv, char** envp)
{
int num = 0;
    for(int i=0;i<1000;i++)
    {
        for (int i = 0; i < 100; i++)
        {
            if (0)//此处为0,最后输出为80,为if(1),输出为160
            {
                _asm nop
            }
        }
        DWORD64 time1, time2;
        time1 = 0;
        time2 = 0;
        DWORD NOP;
        _asm mov NOP, offset l
        NOP += 0x10;
        _mm_clflush((void*)NOP);
        _mm_mfence();
        time1 = __rdtsc();
/*可换成_asm {
            rdtscp;
            mov dword ptr[time1],eax
            mov dword ptr[time1+4],edx
        }*/
        _mm_mfence();
        _asm mov eax, NOP
        _asm mov al, byte ptr[eax]
l:
        if (0)
        {
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
            _asm nop
        }
        _mm_mfence();
        time2 = __rdtsc();
/*可换成_asm {
            rdtscp;
            mov dword ptr[time2], eax
            mov dword ptr[time2 + 4], edx
        }*/
        if(time2-time1>160)
        {
            num++;
        }
        printf("%lld\n", time2 - time1);
    }
    printf("%d\n", num);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

最后于 2023-5-18 17:09 被mb_xmdcmwxq编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 248
活跃值: (1031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sixL 2023-5-18 12:11
2
0
rdtsc读时戳,不稳定。rdtsc指令的执行与系统结构、系统运行状态有关。
应该用invoke QueryPerformanceCounter,addr @stCount。
雪    币: 65
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xmdcmwxq 2023-5-18 13:12
3
0
sixL rdtsc读时戳,不稳定。rdtsc指令的执行与系统结构、系统运行状态有关。 应该用invoke QueryPerformanceCounter,addr @stCount。
QueryPerformanceCounter精度太低了,rdtsc换成rdtscp结果没有变
雪    币: 248
活跃值: (1031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sixL 2023-5-18 13:52
4
0
提问要态度诚恳。
1,到INTEL网站下载手册,仔细阅读、消化与rdtsc指令相关的内容。
2,到MSDN仔细阅读、消化QueryPerformanceCounter API相关的内容。
搞懂至少需要2天时间。
不要盲目妄言。
游客
登录 | 注册 方可回帖
返回