同一程序的运行时间相差很大,有时会达到1000 + us

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>

char kBuff[1024];
const char* kMsg = "0123456789 abcdefghizklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const long kThreshold = 100; //us

void func(const char* fmt, ...) {  
  struct timeval start, end;
  gettimeofday(&start, NULL);

  va_list ap;
  va_start (ap, fmt);
  vsnprintf(kBuff, sizeof(kBuff) - 1, fmt, ap);
  va_end (ap);

  gettimeofday(&end, NULL);

  long during = (end.tv_sec - start.tv_sec) * 1000 * 1000 + (end.tv_usec - start.tv_usec);
  if (during > kThreshold)
    printf("%ld, ", during);
}

int main() {
  long index = 0;
  for(int i = 0; i < 1000000; i++) {
    func("Index:%8ld Msg:%s", index++, kMsg);
  }
}

我运行一个非常简单的代码10,000,000次,有时特定代码段的运行时间相差很大,有时会达到1000 + us。结果如下:

105、106、135、115、121、664、135、1024、165、130,

程序正在Windows-10的Ubuntu-18.04虚拟机中运行

g ++ -ggdb -O2 test.cpp

gettimeofday(&start, NULL);

va_list ap;
va_start (ap, fmt);
vsnprintf(kBuff, sizeof(kBuff) - 1, fmt, ap);
va_end (ap);

gettimeofday(&end, NULL);

上面的代码没有落入内核,并且没有等待I / O,没有等待锁,所以为什么运行时间可以达到1000 us?

我猜到的一个原因是由于操作系统的调度。但是我如何证明这一点?

如果是这个原因,那么我如何准确地测量程序的运行时间?

c++ optimization virtual-machine scheduling measurement
1个回答
1
投票

由于几个原因,仅使用挂钟时间来衡量性能常常不足

  1. OS可能会在CPU上安排其他进程(如您提到的那样]
  2. 由于可能的编译器重新排序,您可能无法测量实际要测量的内容(Enforcing statement order in C++对此进行了详细讨论)
  3. 测量时间的例程(在您的情况下为gettimeofday)本身具有开销,该开销可能包含在您的度量中,因此会引入噪声

[perf tool之类的工具使用performance counterstracepoints分析性能而没有这些问题。

我发现https://www.youtube.com/watch?v=nXaxk27zwlk是学习如何进行基准测试的一个很好的起点。它讨论了google benchmark和perf的用法,它们都可用于衡量性能。

已经说过,使用这些工具并不意味着您的测量不会有差异。实时性能受高速缓存,changing clock frequencies,页面错误等多种因素的影响。除非您使用的是实时系统,否则尾部等待时间几乎不会成为问题。

© www.soinside.com 2019 - 2024. All rights reserved.