【问题标题】:Execution time of thread changes线程更改的执行时间
【发布时间】:2016-08-17 11:10:41
【问题描述】:

我正在使用这种方法:Measure execution time in C (on Windows) 来测量所有线程的执行时间。我在 Windows 上,我正在使用 VC++。

类似这样的:

//initialize start, end, frequency
std::thread thread1(...); 
// and so on I initialise all the threads

thread1.join();
//join all threads

//time = (start-end)/frequency
printf(time);

我多次运行它,我经常得到不同的执行时间。我有 30% 的变化。(这意味着我得到的值在 100 到 70 之间)。我不明白为什么? 30% 的变化不小。

谢谢

【问题讨论】:

  • 你如何衡量时间?如果您测量的是天文数字,请考虑测量处理器时间,因为后者取决于系统负载
  • 时间测量分辨率受调度和其他因素的限制。线程运行时间越短,你的时间就越不准确。我会平均跑很多次。
  • @alexeykuzmin0 与我链接的问题的答案相同,我复制粘贴。使用 QueryPerformanceCounter。
  • 您测量的是“挂钟”时间,而不是您自己的流程所花费的时间。
  • @molbdnilo 我应该如何衡量在我自己的过程中花费的时间?

标签: c++ multithreading


【解决方案1】:

很多事情都会影响执行时间,从系统负载到内存使用再到星星对齐。您没有指定执行时间的顺序,但对于较低的值,30% 的偏差肯定不是闻所未闻的。主要的收获是,执行时间本身基本上不会告诉我们有关系统的任何信息。

【讨论】:

  • 所以你的意思是我不可能不知道执行我的程序需要多少时间?因为在我的情况下,知道确切的执行时间非常重要。谢谢
  • 在一般情况下,没有“确切执行时间”之类的东西。您可以多次运行并取平均值,也可以只计算一次运行的时间,但一般情况下无法说“此程序将需要 n 秒才能运行”。
  • @userDS 准确的执行时间是你所谓的实时操作系统的属性。 Windows 不是其中之一。也就是说,30 年代的变化是有问题的,除非您访问慢速资源,如磁盘或网络。所以调查一下。有什么可疑之处。
  • @UmNyobe 我每次都写入磁盘。
  • @userDS 你有它。您需要所有线程将数据发送到负责写入的单个线程(多个生产者,单个消费者)。见stackoverflow.com/questions/10254147/…
【解决方案2】:

QueryPerformanceCounter 是系统范围的计数器,因此您的结果取决于系统负载和进程调度的细节。

你可以使用QueryProcessCycleTime,它会返回

进程的线程使用的 CPU 时钟周期数。该值包括在用户模式和内核模式下花费的周期。

您可以使用GetCurrentProcess 获取当前进程的句柄。

【讨论】:

  • 我应该传递什么作为 HANDLE ProcessHandle ?如何创建此句柄对象?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2019-07-02
  • 2015-03-31
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
相关资源
最近更新 更多