2015-11-12 169 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。