編輯:代碼被修改後,對我的建議givven。C++測量執行時間
以下代碼的目的是測量簡單操作(1 + 1)的執行時間以及對不執行任何操作的函數(foo)的調用。
代碼編譯和SeeME所能夠正常工作,但我得到的結果是奇怪的 - 這似乎基本操作需要大約在同一時間的函數調用,而且大多數時候,它需要更多的哪怕是一點點時間。
另一個問題是執行時間似乎沒有受到數量的影響 - 它可能是100K或100M,但時間基本相同。另外,如果我選擇一個超過10億的數字,它會減少執行時間。
我不能對谷歌什麼,我需要找到 - 我一定時間的一個簡單opertaion和一個空的功能,這應該是在同一個文件measureTimes()是,或者至少 - 各測量功能應該是在一個文件中包含wholy(再說,現在的移動富()到另一個文件卻減少了時間,到目前爲止
,這是我的程序的輸出:
instructionTimeNanoSecond:1.9
functionTimeNanoSecond: 1.627
#include <iostream>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <math.h>
#include "osm.h"
#define INVALID_ITERATIONS 0
#define DEFAULT_ITERATIONS 1000
#define HOST_NAME_LEN 100
#define TO_NANO 1000
#define TO_MICRO 1000000
#define ROLL 10
using namespace std;
int main()
{
unsigned int iterations = (unsigned int) pow(10, 9);
measureTimes(iterations, iterations, iterations, iterations);
return 0;
}
void foo();
timeMeasurmentStructure measureTimes (unsigned int operation_iterations,
unsigned int function_iterations,
)
{
double functionTimeNanoSecond;
functionTimeNanoSecond = osm_function_time(function_iterations);
cout << "functionTimeNanoSecond: " << functionTimeNanoSecond << "\n";;
double instructionTimeNanoSecond;
instructionTimeNanoSecond = osm_operation_time(operation_iterations);
cout << "instructionTimeNanoSecond: " << instructionTimeNanoSecond << "\n";
}
double osm_operation_time(unsigned int iterations)
{
timeval start;
gettimeofday(&start, NULL);
int x=0;
for(int i = 0; i < iterations/ROLL; i++)
{
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
x=x+1;
}
timeval end;
gettimeofday(&end, NULL);
timeval diff;
timersub(&end, &start, &diff);
// double micro_seconds =(double) (end.tv_usec - start.tv_usec);
double ret =((double) diff.tv_sec*TO_MICRO + diff.tv_usec)/((double) iterations);
return ret * TO_NANO;
}
double osm_function_time(unsigned int iterations)
{
timeval start;
gettimeofday(&start, NULL);
for(int i = 0; i < iterations/ROLL; i++)
{
foo();
foo();
foo();
foo();
foo();
foo();
foo();
foo();
foo();
foo();
}
timeval end;
gettimeofday(&end, NULL);
timeval diff;
timersub(&end, &start, &diff);
//double micro_seconds = (double)((end.tv_sec - start.tv_sec)*TO_MICRO+(end.tv_usec - start.tv_usec));
double ret =((double) diff.tv_sec*TO_MICRO + diff.tv_usec)/((double) iterations);
return ret * TO_NANO;
}
void foo()
{
return;
}
另一個C與C++流...無論如何,發佈你的編譯器標誌,因爲你的代碼大部分可能會被優化出來。 – Zereges
我會檢查彙編輸出,看看你想要的那些調用是否存在。 – iksemyonov
你怎麼弄到的?我的代碼成功編譯 – proton