的開銷時間的變化在這裏是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。 –