gpt4 book ai didi

c++ - 两条相似线路的 CPU 时间差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:45 24 4
gpt4 key购买 nike

我的程序中有一个 while 循环,其中 IterZNextIterZ 是指向列表中节点的指针。列表中的节点是具有名为“索引”的字段的结构类型。

double xx = 20.0;
double yy = 10000.0;
double zz;
while (IterZNext!=NULL && NextIndex<=NewIndex)
{
IterZ=IterZNext;
IterZNext = IterZ->Next;
if (IterZNext!=NULL)
{
zz = xx + yy;
NextIndex1 = IterZNext->Index; // line (*)
NextIndex = IterZNext->Index; // line (**)
IterZNext->Index;
}
}

当我分析我的程序时,我发现了行 (*)

NextIndex1 = IterZNext->Index;

消耗大部分 CPU 时间(2.193 秒),而行 (**)

NextIndex = IterZNext->Index;

与行 (*) 完全相同,仅使用 0.093 秒。我用Intel VTune Amplifier看到了这两条线的汇编,如下:

Address Line    Assembly                   CPU Time Instructions Retired
Line (*):
0x1666 561 mov eax, dword ptr [ebp-0x44] 0.015s 50,000,000
0x1669 561 mov ecx, dword ptr [eax+0x8]
0x166c 561 mov dword ptr [ebp-0x68], ecx 2.178s 1,614,000,000

Line (**):
0x166f 562 mov byte ptr [ebp-0x155], 0x1 0.039s 80,000,000
0x1676 562 mov eax, dword ptr [ebp-0x44] 0.027s 44,000,000
0x1679 562 mov ecx, dword ptr [eax+0x8]
0x167c 562 mov dword ptr [ebp-0x5c], ecx 0.026s 94,000,000

如果我更改行 () 和行 (*) 的顺序,则程序将更改为

double xx = 20.0;
double yy = 10000.0;
double zz;
while (IterZNext!=NULL && NextIndex<=NewIndex)
{
IterZ=IterZNext;
IterZNext = IterZ->Next;
if (IterZNext!=NULL)
{
zz = xx + yy;
NextIndex = IterZNext->Index; // line (**)
NextIndex1 = IterZNext->Index; // line (*)
IterZNext->Index;
}
}

组装结果更改为

Address Line    Assembly    CPU Time    Instructions Retired
Line (**):
0x1666 560 mov byte ptr [ebp-0x155], 0x1 0.044s 84,000,000
0x166d 560 mov eax, dword ptr [ebp-0x44] 0.006s 2,000,000
0x1670 560 mov ecx, dword ptr [eax+0x8] 0.001s 4,000,000
0x1673 560 mov dword ptr [ebp-0x5c], ecx 1.193s 1,536,000,000

Line (*):
0x1676 561 mov eax, dword ptr [ebp-0x44] 0.052s 128,000,000
0x1679 561 mov ecx, dword ptr [eax+0x8]
0x167c 561 mov dword ptr [ebp-0x68], ecx 0.034s 112,000,000

在这种情况下,第 (*) 行使用了大部分 CPU 时间 (1.245s),而第 () 行仅使用了 0.086s。

谁能告诉我:(1) 为什么第一次赋值需要这么长时间?请注意,zz=xx+yy 行仅使用了 0.058s。这与缓存未命中有关吗?因为列表中的所有节点都是动态生成的。(2) 为什么这两条线的 CPU 时间差异很大?

谢谢!

最佳答案

所有现代 CPU 都是超标定器和无序的——这意味着指令实际上并不是按照汇编的顺序执行的,而且并不存在像当前 PC 这样的东西——有很多 10 条指令飞行并立即执行。

因此,CPU 报告的任何采样信息都只是 CPU 正在执行的粗略区域 - 它正在执行采样中断关闭时指示的指令;但它也在执行所有其他飞行中的任务!

然而,人们已经习惯(并期望)分析工具能够告诉他们 CPU 当前正在运行的确切哪条指令 - 因此当采样中断触发时,CPU 基本上会选择许多事件指令中的一条说明是“当前”的。

关于c++ - 两条相似线路的 CPU 时间差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com