【发布时间】:2014-02-06 07:48:08
【问题描述】:
这里是c++代码,我用的是vs2013,发布模式
#include <ctime>
#include <iostream>
void Tempfunction(double& a, int N)
{
a = 0;
for (double i = 0; i < N; ++i)
{
a += i;
}
}
int main()
{
int N = 1000; // from 1000 to 8000
double Value = 0;
auto t0 = std::time(0);
for (int i = 0; i < 1000000; ++i)
{
Tempfunction(Value, N);
}
auto t1 = std::time(0);
auto Tempfunction_time = t1-t0;
std::cout << "Tempfunction_time = " << Tempfunction_time << '\n';
auto TempfunctionPtr = &Tempfunction;
Value = 0;
t0 = std::time(0);
for (int i = 0; i < 1000000; ++i)
{
(*TempfunctionPtr)(Value, N);
}
t1 = std::time(0);
auto TempfunctionPtr_time = t1-t0;
std::cout << "TempfunctionPtr_time = " << TempfunctionPtr_time << '\n';
std::system("pause");
}
我将N的值从1000改为8000,并记录Tempfunction_time和TempfunctionPtr_time。 结果很奇怪:
N=1000 , Tempfunction_time=1, TempfunctionPtr_time=2;
N=2000 , Tempfunction_time=2, TempfunctionPtr_time=6;
N=4000 , Tempfunction_time=4, TempfunctionPtr_time=11;
N=8000 , Tempfunction_time=8, TempfunctionPtr_time=21;
TempfunctionPtr_time - Tempfunction_time 不是常数, 和 TempfunctionPtr_time = 2~3 * Tempfunction_time。 区别应该是一个常量,就是函数指针的开销。
怎么了?
编辑:
假设 VS2013 内联 Tempfunction,如果它是由 Tempfunction() 调用的,而如果它是由 (*TempfunctionPtr) 调用的,则不内联它,那么我们可以解释一下区别。那么,如果这是真的,为什么编译器不能内联 (*TempfunctionPtr) ?
【问题讨论】:
-
我现在看到你在发布模式下构建它。我现在确定这是优化。关闭所有可能的优化(我不知道在 vs 2013 中如何做)并再次尝试查看。
-
std::time 以秒为单位,也许你需要毫秒精度的度量。
-
实际上你可以使用 QueryPerformanceCounter,因为你在 Windows 上。
-
使 'a' 和 'i' 易变并再次测试,也将 N 增加到 10000,这应该可以减轻 fptr 取消引用
标签: c++ function-pointers