2015-11-12 222 views
0

我的目標是看到過了多長時間運行來計算我的線程的性能,但我得到了一些問題:計算時間

我的代碼如下:

的#include

thread() { 
    struct timeval start, finish; 

    gettimeofday(&start, NULL); 
    -- code -- 
    gettimeofday(&start, NULL); 

    double dif = ((end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)*0.000001); 
    printf("%f", dif); 

} 

我希望我的代碼以秒和毫秒的格式打印,例如:3.252或類似的東西,但我得到的東西是:0.1615680.161717。

有誰知道如何將此格式轉換爲標準的x.xxxx秒版本?

+0

我高度懷疑這不是完整的源代碼。你的意思是使用'&start'兩次?你是否想要從格式字符串中省略'\ n'? – Nemo

+1

由於沒有'\ n',我認爲在輸出中有兩個連接了'0.161568'' 0.161717'的值。 – nnn

+0

而不是gettimeofday,看看[C++ 11的'chrono'庫](http://en.cppreference.com/w/cpp/chrono)。特別是,[high_resolution_clock'](http://en.cppreference.com/w/cpp/chrono/high_resolution_clock) – user4581301

回答

0

要打印doubleprintf("%lf", dif);

編輯(校正):如果指定器是%f%lf不要緊,參數提升爲double

此外,您使用的變量不一致。撥打gettimeofday的兩個電話都使用start變量。 end在哪裏使用?

+0

仍然給我同樣的東西 – QQCompi

+2

'%f'對'double'很好。任何'float'參數在進入省略號時都會被提升爲'double',所以當使用'va_arg'獲得參數時'printf'不能區分。它可以在''c''之後做一些不同的事情(除非沒有指定),但它必須以'double'開頭。 – chris

+0

@chris至少在'glibc'中看起來'lf'被忽略。一個變量['is_long'被設置](https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c#l1603),但之後它不被使用當傳遞給['__printf_fp'](https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c#l760) – nnn

1

C++ 11的計時庫使這一切變得簡單。多麼容易?這很簡單:

需要包括:

#include <chrono> 

螺紋體:

std::chrono::time_point<std::chrono::high_resolution_clock> start, end; 
start = std::chrono::high_resolution_clock::now(); 
//--code-- 
end = std::chrono::high_resolution_clock::now(); 
std::chrono::duration<double> elapsed = end-start; 
std::cout << elapsed.count() << std::endl; 

鏈接庫和功能使用:

chrono

high_resolution_clock

duration

作爲一個額外的好處,它的作用不僅僅是Linux。