【发布时间】:2011-09-30 18:32:43
【问题描述】:
我的程序中有一个while循环,其中IterZNext、IterZ是指向列表中节点的指针。列表中的节点是 struct 类型,带有一个名为“Index”的字段。
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.193s),而行(**)
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 时间的陈述基于什么 - 分析器和结果输出是什么?
标签: c++ c assembly profiling cpu-usage