【发布时间】:2012-03-19 05:44:18
【问题描述】:
使用 VC++ 的__assume 是否可以获得可衡量的性能提升?如果是这样,请在您的答案中发布带有代码和基准的证明。
关于 __assume 的稀疏 MSDN 文章:http://msdn.microsoft.com/en-us/library/1b3fsfxw(v=vs.100).aspx
文章中提到使用__assume(0) 使switch 语句通过__assume(0) 处理default 的情况更快。我测量到以这种方式使用 __assume(0) 并没有提高性能:
void NoAssumeSwitchStatement(int i)
{
switch (i)
{
case 0:
vector<int>();
break;
case 1:
vector<int>();
break;
default:
break;
}
}
void AssumeSwitchStatement(int i)
{
switch (i)
{
case 0:
vector<int>();
break;
case 1:
vector<int>();
break;
default:
__assume(0);
}
}
int main(int argc, char* argv[])
{
const int Iterations = 1000000;
LARGE_INTEGER start, middle, end;
QueryPerformanceCounter(&start);
for (int i = 0; i < Iterations; ++i)
{
NoAssumeSwitchStatement(i % 2);
}
QueryPerformanceCounter(&middle);
for (int i = 0; i < Iterations; ++i)
{
AssumeSwitchStatement(i % 2);
}
QueryPerformanceCounter(&end);
LARGE_INTEGER cpuFrequency;
QueryPerformanceFrequency(&cpuFrequency);
cout << "NoAssumeSwitchStatement: " << (((double)(middle.QuadPart - start.QuadPart)) * 1000) / (double)cpuFrequency.QuadPart << "ms" << endl;
cout << " AssumeSwitchStatement: " << (((double)(end.QuadPart - middle.QuadPart)) * 1000) / (double)cpuFrequency.QuadPart << "ms" << endl;
return 0;
}
圆形控制台输出,1000000 次迭代:
NoAssumeSwitchStatement:46 毫秒
AssumeSwitchStatement:46ms
【问题讨论】:
-
你的例子似乎太琐碎了。如果您查看汇编程序的输出,它会是一样的。没有。
-
IMO,当编译器知道无法达到默认情况时,您将其排除在外而不是枯燥的假设指令时,这会更有意义......
-
__assume是对优化器的提示,在更高级别的优化中最有用。 (即超出寄存器分配和 CSE)。在这些级别上,可以预期这个示例是完全内联的;即您的 2 个函数调用和所有 4 个临时对象都已创建。
标签: c++ performance visual-c++ compiler-optimization