Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测量C+的运行时间+;密码? 我想测量我的C++代码的运行时。执行我的代码大约需要12个小时,我希望这次在代码执行结束时编写代码。如何在我的代码中实现它_C++_Linux - Fatal编程技术网

测量C+的运行时间+;密码? 我想测量我的C++代码的运行时。执行我的代码大约需要12个小时,我希望这次在代码执行结束时编写代码。如何在我的代码中实现它

测量C+的运行时间+;密码? 我想测量我的C++代码的运行时。执行我的代码大约需要12个小时,我希望这次在代码执行结束时编写代码。如何在我的代码中实现它,c++,linux,C++,Linux,操作系统:Linux我在我的一个项目中使用了类似的东西: #include <sys/time.h> struct timeval start, end; gettimeofday(&start, NULL); //Compute gettimeofday(&end, NULL); double elapsed = ((end.tv_sec - start.tv_sec) * 1000) + (end.tv_usec / 1000 - start.

操作系统:Linux

我在我的一个项目中使用了类似的东西:

#include <sys/time.h>

struct timeval start, end;
gettimeofday(&start, NULL);
//Compute
gettimeofday(&end, NULL);
double elapsed = ((end.tv_sec - start.tv_sec) * 1000) 
        + (end.tv_usec / 1000 - start.tv_usec / 1000);
#包括
结构timeval开始、结束;
gettimeofday(&start,NULL);
//计算
gettimeofday(&end,NULL);
双时间=((end.tv_sec-start.tv_sec)*1000)
+(end.tv_usec/1000-start.tv_usec/1000);

这是毫秒,它对C和C++都有效。

< P>如果你使用C++ 11,你可以使用<代码> StasyCalth::No():/> >:

auto start=std::chrono::system_clock::now();
/*做些工作*/
自动结束=标准::时钟::系统时钟::现在();
自动运行=结束-开始;
std::cout您可以使用启动程序。当它结束时,它会打印关于程序运行的时间统计信息。很容易配置要打印的内容。默认情况下,它打印执行程序所需的用户和CPU时间

编辑:请注意,代码中的每个度量值都是不正确的,因为您的应用程序将被其他程序阻止,从而给出错误的值*

*通过错误的值,我的意思是很容易获得执行程序所需的时间,但该时间取决于程序执行期间的CPU负载。要获得相对稳定的时间测量,这不依赖于CPU负载,可以使用CPU执行应用程序并将其作为测量结果。

在C++11中使用和不使用来测量运行时间。原因是(引用系统时钟的文档):

在大多数系统上,系统时间可以随时调整

虽然稳定时钟是单调的,更适合测量时间间隔:

类std::chrono::staid_clock表示单调时钟。时间 该时钟的点不能随着物理时间的向前移动而减少。 该时钟与挂钟时间无关,最适合用于 测量间隔

下面是一个例子:

auto start = std::chrono::steady_clock::now();
// do something
auto finish = std::chrono::steady_clock::now();
double elapsed_seconds = std::chrono::duration_cast<
  std::chrono::duration<double> >(finish - start).count();
auto start=std::chrono::staid_clock::now();
//做点什么
自动完成=标准::时钟::稳定时钟::现在();
双倍已用秒=标准::计时::持续时间<
std::chrono::duration>(完成-开始).count();

一个小的实用技巧:如果您正在测量运行时间,并且想要报告秒数,那么您很少需要cast,因为它可以为您提供整秒数。要以秒为单位获得双精度时间,请使用上面的示例。

您还可以尝试一些自动启动和停止的计时器类,并收集任何代码块中花费的平均、最大和最小时间以及调用次数的统计信息。这些cxx rtimer类在上提供,并支持使用std::chrono、clock_gettime()或boost::posix_time作为后端时钟源

使用这些计时器,您可以执行以下操作:

void timeCriticalFunction() {
    static rtimers::cxx11::DefaultTimer timer("expensive");
    auto scopedStartStop = timer.scopedStart();
    // Do something costly...
}

程序完成时将计时统计数据写入std::cerr。

这是我使用的代码:

  const auto start = std::chrono::steady_clock::now();

  // Your code here.

  const auto end = std::chrono::steady_clock::now();
  std::chrono::duration<double> elapsed = end - start;
  std::cout << "Time in seconds: " << elapsed.count() << '\n';
const auto start=std::chrono::staid_clock::now();
//你的代码在这里。
const auto end=std::chrono::staid_clock::now();
std::chrono::持续时间=结束-开始;

std::cout如果希望使用printf()打印测量的时间,可以使用以下方法:

auto start = std::chrono::system_clock::now();
/* measured work */
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
printf("Time = %lld ms\n", static_cast<long long int>(elapsed.count()));
auto start=std::chrono::system_clock::now();
/*测量工作*/
自动结束=标准::时钟::系统时钟::现在();
自动运行=标准::计时::持续时间\u转换(结束-开始);
printf(“时间=%lld ms\n”,静态_转换(经过的.count());

在什么操作系统上运行代码?我喜欢一次分析多个代码。启动任何程序时只需使用
time
命令。Linux上有几种时间概念。看,我认为阻塞也是程序运行所需时间的一部分,不是吗?@EitanT不是,因为CPU负载会发生变化。当前负载不必与1小时内或明天的负载相同。@Bцццццћ好吧,这取决于实际情况。由用户决定是测量挂钟时间还是CPU时间。这两种方法都是完全有效的,只是针对不同的目标。@Betabando:如果你按照建议使用
time
,你就不必做出决定。它同时报告运行时间和CPU时间。@MikeSeymour我知道。如果要从命令行测量执行时间,使用
time
这是一个不错的解决方案。我只是反对这样一种观点,即测量CPU时间是衡量程序运行所需时间的唯一有价值的方法(正如对EitanT的回答所建议的那样)。我的问题是:C++/C++11差异和boost库如何?@loldop我相信C++11实现是boost chrono库的一个子集。因此,它们应该有一个非常相似的API(如果不是相同的话)。使用C++11的好处是不需要使用Boost(如果chrono是Boost的唯一库)。
系统时钟可以跳转(由于用户更改系统时间、NTP调整时钟、插入闰秒)。测量时间间隔是没有用的。我没有得到实用的提示。
std::chrono::duration_cast
不是将两个时间点之间的差值作为总秒数的方法吗?@Isaac我的意思是,如果差值小于1秒,
std::chrono::duration_cast
将返回0。如果您想将持续时间作为浮点数,那么请使用
double
而不是
seconds
@vita。但它返回了一个错误的时间,我不明白发生了什么。我将此时间与从命令行上的“time”命令中获得的时间进行比较,它们是不同的。Structure
start
end
给出了自epoch开始以来的秒数和微秒数:
  const auto start = std::chrono::steady_clock::now();

  // Your code here.

  const auto end = std::chrono::steady_clock::now();
  std::chrono::duration<double> elapsed = end - start;
  std::cout << "Time in seconds: " << elapsed.count() << '\n';
auto start = std::chrono::system_clock::now();
/* measured work */
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
printf("Time = %lld ms\n", static_cast<long long int>(elapsed.count()));