的开销时间的变化在这里是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与秒一起工作,也许你需要毫秒精度的措施。 – Narkha
实际上,您可以在Windows上使用QueryPerformanceCounter。 –