用户空间(Linux)中是否有高分辨率时钟(我们)?
Is there any high resolution clock (us) in User space (Linux)?
你知道Linux用户空间中高分辨率时钟(最小微秒)的任何C/C++实现(即使它不是便携式的)吗?
目标是测量某些低延迟操作经过的间隔。 我测量了内核空间时钟会导致延迟峰值。
根据我对红帽 7.2 的研究:
- std::chrono::high_resolution_clock 最大分辨率为毫秒;
- clock_gettime CLOCK_MONOTONIC和CLOCK_REALTIME通过内核系统调用执行;
- gettimeofday通过内核系统调用执行;
- clock_gettime CLOCK_MONOTONIC_COARSE和CLOCK_REALTIME_COARSE在用户空间中执行,但最大分辨率为毫秒;
谢谢。
一种选择是通过__builtin_ia32_rdtsc
函数使用rdtsc
指令。在现代英特尔 CPU 上,rdtsc
在任何 CPU 频率下以基本时钟速率滴答作响,因此您可以通过将计数器除以基本(非提升)CPU 频率(以 GHz 为单位)将计数器转换为纳秒:
#include <regex>
#include <string>
#include <fstream>
#include <iostream>
double cpu_base_frequency() {
std::regex re("model name\s*:[^@]+@\s*([0-9.]+)\s*GHz");
std::ifstream cpuinfo("/proc/cpuinfo");
std::smatch m;
for(std::string line; getline(cpuinfo, line);) {
regex_match(line, m, re);
if(m.size() == 2)
return std::stod(m[1]);
}
return 1; // Couldn't determine the CPU base frequency. Just count TSC ticks.
}
double const CPU_GHZ_INV = 1 / cpu_base_frequency();
int main() {
auto t0 = __builtin_ia32_rdtsc();
auto t1 = __builtin_ia32_rdtsc();
std::cout << (t1 - t0) * CPU_GHZ_INV << "nsecn";
}
英特尔文档中的更多信息:
恒定的 TSC行为可确保每个时钟周期的持续时间是均匀的,并支持将 TSC 用作挂钟计时器,即使处理器内核更改频率也是如此。这是向前发展的体系结构行为。
不变 TSC将在所有 ACPI P、C 和 T 状态中以恒定速率运行。这是向前发展的体系结构行为。在具有固定 TSC 支持的处理器上,操作系统可能会将 TSC 用于挂钟计时器服务(而不是 ACPI 或 HPET 计时器)。TSC 读取效率更高,并且不会产生与环转换或访问平台资源相关的开销。
不变TSC基于以核心晶体时钟频率运行的不变计时硬件(称为始终运行计时器或ART)。
可扩展总线频率在位域MSR_PLATFORM_INFO[15:8]中编码,标称TSC频率可以通过将该数字乘以100 MHz的总线速度来确定。
boost::timer 有一些有趣的函数。 我特别喜欢自动计时器。 它以微秒为单位显示时间。 不确定它是否可以低于此。
相关文章:
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 如何在C++中为高分辨率时钟声明变量?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 实现高分辨率计时器的最佳方法
- 用户空间(Linux)中是否有高分辨率时钟(我们)?
- 使用QPrinter::高分辨率不打印
- 以高分辨率渲染QChartView
- C++Windows中的高分辨率定时器库
- VS2013中的高分辨率时钟
- 如何以最佳方式将高分辨率图像数据存储在无符号字符*中C++
- 高分辨率程序时间
- 如何获得高分辨率时间戳作为双精度
- C++中的高分辨率定时器
- 将高分辨率时钟时间转换为整数(Chrono)
- C++11如何打印出高分辨率时钟时间点
- 高分辨率计时器与低分辨率计时器
- 为什么我应该使用SetTimer功能,而不是多媒体定时器服务的应用程序不需要高分辨率定时
- 如何获得高分辨率时钟的精度
- c++高分辨率SYSTEMTIME结构,大于ms
- Windows(也包括OS X、Linux)上Qt中的高分辨率定期计时器