同一程序的运行时间差异很大,有时达到1000+us
The running time of the same program varies greatly, sometimes reaching 1000+us
#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我们呢?
我猜的一个原因是由于操作系统的调度。 但是我如何证明这一点呢?
如果是这个原因,那么如何准确测量程序的运行时间呢?
仅仅使用挂钟时间测量性能通常是不够的,原因有几个,例如
- 操作系统可能会在CPU上调度其他进程(如您所提到的(
- 由于可能的编译器重新排序,您可能无法测量实际尝试测量的内容(在C++中强制执行语句顺序详细讨论这一点( 测量
- 时间的例程(在您的情况下是gettimeofday(本身具有开销,该开销可能包含在您的测量中,从而引入噪声
有一些工具,如 perf 工具,它使用性能计数器和跟踪点来分析性能,而不会出现这些问题。
我发现 https://www.youtube.com/watch?v=nXaxk27zwlk 学习如何进行基准测试的良好起点。它讨论了谷歌基准测试和性能的用法,两者都有助于衡量性能。
话虽如此,使用这些工具并不意味着您的测量不会有差异。实时性能受多种因素影响,如缓存、时钟频率变化、页面错误等。除非您使用的是实时系统,否则尾部延迟很少成为问题。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 同一程序的运行时间差异很大,有时达到1000+us
- C 程序仅在字符阵列获得“ 1000!”的输入时才在DELETE上崩溃
- 生成从 1 到 1000 的卡拉奇特系列的程序,其中包括数字和字母
- 以下程序中最大 int 1000 000(在 int 范围内)的整数溢出
- 程序不适用于大于 1000 的数字
- 没有输出,我已经编了一个程序去找所有阿姆斯壮没有.在100到1000之间
- 编写程序生成1000个0-49范围内的随机整数.(c++)