- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的应用程序中使用 QueryPerformanceCounter() 函数来测量时间。此功能还用于提供我的应用程序生命周期的时间线。最近我注意到其他时间函数的时间有偏差。最后,我写了一个小测试来检查漂移是否真实。 (我用的是VS2013编译器)
#include <Windows.h>
#include <chrono>
#include <thread>
#include <cstdio>
static LARGE_INTEGER s_freq;
using namespace std::chrono;
inline double now_WinPerfCounter()
{
LARGE_INTEGER tt;
if (TRUE != ::QueryPerformanceCounter(&tt))
{
printf("Error in QueryPerformanceCounter() - Err=%d\n", GetLastError());
return -1.;
}
return (double)tt.QuadPart / s_freq.QuadPart;
}
inline double now_WinTick64()
{
return (double)GetTickCount64() / 1000.;
}
inline double now_WinFileTime()
{
FILETIME ft;
::GetSystemTimeAsFileTime(&ft);
long long * pVal = reinterpret_cast<long long *>(&ft);
return (double)(*pVal) / 10000000. - 11644473600LL;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (TRUE != ::QueryPerformanceFrequency(&s_freq))
{
printf("Error in QueryPerformanceFrequency() - Err=#d\n", GetLastError());
return -1;
}
// save all timetags at the beginning
double t1_0 = now_WinPerfCounter();
double t2_0 = now_WinTick64();
double t3_0 = now_WinFileTime();
steady_clock::time_point t4_0 = steady_clock::now();
for (int i = 0;; ++i) // forever
{
double t1 = now_WinPerfCounter();
double t2 = now_WinTick64();
double t3 = now_WinFileTime();
steady_clock::time_point t4 = steady_clock::now();
printf("%03d\t %.3lf %.3lf %.3lf %.3lf \n",
i,
t1 - t1_0,
t2 - t2_0,
t3 - t3_0,
duration_cast<nanoseconds>(t4 - t4_0).count() * 1.e-9
);
std::this_thread::sleep_for(std::chrono::seconds(10));
}
return 0;
}
输出是,令人困惑:
000 0.000 0.000 0.000 0.000
...
001 10.001 10.000 10.002 10.002
...
015 150.006 150.010 150.010 150.010
...
024 240.009 240.007 240.015 240.015
...
025 250.010 250.007 250.015 250.015
...
026 260.010 260.007 260.016 260.016
...
070 700.027 700.039 700.041 700.041
为什么会有差异?使用不同的 API 函数时,一秒的持续时间看起来不一样?此外,在一天中,差异不是恒定的...
最佳答案
这是正常的,负担得起的时钟永远不会具有无限的精度。 GetSystemTime() 和 GetTickCount() 会定期从 Internet 时间服务器(默认为 time.windows.com)重新校准。它使用负担不起的原子钟来计时。追赶或减速的调整是渐进的,以避免让软件心脏病发作。他们报告的时间最多会偏离地球自转几秒钟,定期重新校准会限制长期漂移误差。
但是 QPF 没有经过校准,它的分辨率太高,无法让这些调整不影响它通常用于的短间隔测量。它源自芯片组上可用的频率源,由系统构建者选择。受制于典型的电子零件公差,温度尤其会影响精度并导致较长时间的可变漂移。因此QPF只适用于测量相对较短的间隔。
不可避免地,两个时钟不可能相同,您会看到它们漂移开来。您必须选择一个或另一个作为“主”时钟。如果长期精度很重要,那么您必须选择校准源,如果高分辨率而不是精度很重要,则选择 QPF。如果两者都很重要,那么您需要定制硬件,例如 GPS 时钟。
关于c++ - performancecounter C++ 的窗口时序漂移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35601880/
以下段落使我感到困惑: 来自文章:Acquiring high-resolution time stamps When you need time stamps with a resolution o
我有六台机器要使用 perfmon 进行监控。我想在所有六个计数器上使用相同的一组计数器。有没有办法设置模板,以便我可以一次指定这些计数器,然后根据此模板设置其他数据收集器?还是我真的必须手动设置每个
我正在尝试设置我的 Azure Web 应用程序以包含第三方软件的使用,这似乎需要访问 PerformanceCounters。在本地,这工作正常,但是当我在 Azure 中运行它时,出现以下错误:
我用perf脚本命令查看perf.data文件的结果,但我不是很明白每一列的含义。例如,如果我有以下结果: perf 3198 [000] 13156.201238: bus-cycles: ff
我想知道是否有用于精确时间测量(如函数的执行时间)的“.net 集成”解决方案?目前我正在使用 Kernel32 的 PerformanceCounters。 [DllImport("Kern
我尝试使用 PerformanceCounter 来监控域环境中的远程服务器信息,例如: var counter = new PerformanceCounter("PhysicalDisk", "D
我正在使用 System.Data PerfomanceCounter 类,并且我找到了一些关于如何检索磁盘空间或 CPU 使用率的非常具体的示例。 但是我找不到关于以下可能值的文档: Perfoma
我知道使用 Perfmon.msc 您可以创建自定义性能计数器,并且通过使用计数器日志,您可以将计数器值写入文本文件。 我也明白我也可以通过使用 System.Diagnostics.Performa
我正在研究电荷平衡系统,因此我需要知道每台机器的电荷。 PerformanceCounter 似乎是可行的方法,但创建第一个需要 38 到 60 秒。然而,每个后续的新 Counter 或“NextV
我想访问在具有不同本地化的系统上运行的应用程序中的“处理器时间 %”计数器。 为此,我想通过其索引访问计数器,该索引保证是唯一的(请参阅 https://support.microsoft.com/e
我在一台服务器上工作,它从 PerformanceCounters 读取“% CPU”和“可用内存”。它在我的开发机器上运行良好。但是在实际的服务器上,读取这两个 PerformanceCounter
我有一个 Windows 服务,它跨多个线程运行框架的实现。每个正在运行的实例都有一些我需要跟踪的共同点,例如,处理的项目数、上次处理项目的时间等。在此基础监控数据之上,我想在框架允许实现动态添加自己
我正在使用 C# 的“PerformanceCounter”类来计算“内存”类别下的以下 2 个计数器“可用字节数”和“使用中的 promise 字节数百分比”。 Perfor
我不知道为什么,但是很多电脑在执行以下操作时挂起: void Init() { net1 = new List(); net2 = new List(); foreach (s
我正在制作一个程序,我需要从性能计数器中获取一些值。 目前一切正常。但是,当我尝试获取特定 IIS 站点的“Requests/Sec”计数器时,我没有获得任何值,比如它根本没有更新。但是,如果我在我的
我在使用 PerformanceCounter 时遇到问题,我想获取 CPU 温度,但我只找到了这个: PerformanceCounter tempCount = new PerformanceCo
我在我的应用程序中使用 QueryPerformanceCounter() 函数来测量时间。此功能还用于提供我的应用程序生命周期的时间线。最近我注意到其他时间函数的时间有偏差。最后,我写了一个小测试来
伙计们,我有以下代码: using System.Diagnostics; private PerformanceCounter diskRead = new PerformanceCounter()
我正在尝试了解如何收集计算机上每个处理器的当前使用百分比。如果我使用“System.Environment.ProcessorCount;”我可以获得计算机上的处理器数量,它当前返回“2”。我不知道自
我正在尝试手动将一些 PerformanceCounters 发送到 ApplicationInsights。 我尝试使用以下正文直接发布到 https://dc.services.visualstu
我是一名优秀的程序员,十分优秀!