为啥与两者相比得到不同的毫秒值(QTIme 和 QueryPerformanceCounter)
Posted
技术标签:
【中文标题】为啥与两者相比得到不同的毫秒值(QTIme 和 QueryPerformanceCounter)【英文标题】:why am getting different milliseconds value in compared to both (QTIme & QueryPerformanceCounter)为什么与两者相比得到不同的毫秒值(QTIme 和 QueryPerformanceCounter) 【发布时间】:2017-02-10 11:29:27 【问题描述】:我的 .h 文件
#ifndef ITime_H
#define ITime_H
#include <QDebug>
#include <iostream>
#include <QtCore>
#include <windows.h>
class ITime
public:
ITime();
~ITime();
void start();
quint64 milli();
quint64 elapsed();
public:
QTime oStartTime;
QTime oEndTime;
LARGE_INTEGER ntime1,ntime2;
LARGE_INTEGER freq;
;
#endif // ITime_H
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\
我的 cpp 文件
#include <QTime>
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
ITime::ITime()
ITime::~ITime()
void ITime::start()
oStartTime = QTime::currentTime();
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&ntime1);
quint64 ITime::milli()
quint64 milli = oStartTime.msecsTo(oEndTime);
return milli;
quint64 ITime::elapsed()
quint64 ntime = 0;
QueryPerformanceCounter(&ntime2);
oEndTime = QTime::currentTime();
ntime = (ntime2.QuadPart-ntime1.QuadPart)/(freq.QuadPart/1000000.0);
double elapsedMilliseconds = elapsedTicks.QuadPart / (freq.QuadPart/ 1000.0);
qDebug() << "milli seconds by counter :" << elapsedMilliseconds ;
return ntime;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\
我的主文件
#include "ITime.h"
#include <iostream>
int main()
ITime time;
time.start();
qDebug() << "Start time" << time.oStartTime ;
qDebug() << "differnce time in micro by counter" << time.elapsed() ;
qDebug() << "differnce time in milli " << time.milli() ;
qDebug() << "End time" << time.oEndTime ;
我的输出是这样的
开始时间QTime("17:57:46") 计数器毫秒数:1.20633 计数器的微差时间:1206 使用 QTime 以毫秒为单位的差异时间:0 结束时间 QTime("17:57:46")
在这里,通过考虑输出 计数器的微秒是 1206,这意味着几乎 1 毫秒,但是 QTime 的输出毫秒为 0,所以我怎样才能获得相同的毫秒和微秒差异
实际上我想知道为什么 QTime 和计数器之间会出现时间差异
【问题讨论】:
您正在处理整数。freq.QuadPart/1000000
将丢弃您可能想要保留的精度。可能与其他部门相同。我不知道公式是否正确,但如果不溢出分子,以下公式会更安全:(1000000 * (ntime2.QuadPart-ntime1.QuadPart))/freq.QuadPart;
如果您可以依赖 Windows 8 或更高版本,那么内置的功能可以将实时与 QPC 相结合,称为 GetSystemTimePreciseAsFileTime)。这提供了 0.1 微秒增量的精度,这是您在 Windows 上可以获得的最佳值。与 Windows 上的准确时间一样,this 是必读的。
根据QTime::msecsTo()
的文档: 1) 它返回signed int
; 2)它“如果任一时间无效,则可以返回0”(可以用QTime::isValid()
检查)
我认为您在这种情况下对 QTime 的使用是不正确的。 QTime 仅提供毫秒精度的挂钟时间,它并非设计为高分辨率稳定时钟。
std::chrono
是你的朋友。稳定时钟使用性能计数器,更容易编写,更便携。
【参考方案1】:
QueryPerformanceFrequency
以“每秒计数”提供计数器频率。这意味着无论QueryPerformanceCounter
返回什么,都将根据QueryPerformanceFrequency
提供的除数来表示。换句话说(假设您可以定位一个对QuadPart
进行算术运算的系统,这极有可能)...
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER startTicks;
QueryPerformanceCounter(&startTicks);
//Do work here
LARGE_INTEGER endTicks;
QueryPerformanceCounter(&endTicks);
LARGE_INTEGER elapsedTicks;
elapsedTicks.QuadPart = endTicks.QuadPart - startTicks.QuadPart;
double elapsedMicoseconds = elapsedTicks.QuadPart / (freq.QuadPart / 1000000.0);
double elapsedMilliseconds = elapsedTicks.QuadPart / (freq.QuadPart / 1000.0);
double elapsedSeconds = elapsedTicks.QuadPart / (double)freq.QuadPart;
... 应该回答您的问题。您可以以任何您认为合适的方式将其分解,包括截断为 SS.MMMMM
(秒和毫秒)等形式。
另外请注意,您应该只调用一次QueryPerformanceFrequency
并保存结果,因为它在系统启动之间不会改变,它只是第一次调用之后的冗余调用。
【讨论】:
以上是关于为啥与两者相比得到不同的毫秒值(QTIme 和 QueryPerformanceCounter)的主要内容,如果未能解决你的问题,请参考以下文章
为啥我得到高 MAE(平均绝对误差)和 MSE(均方误差)与 MAPE(平均绝对百分比误差)相比?
2.6.3 QTime类与QTimeEdit控件介绍(时间处理)
为啥 NegativeBinomialP 与 R 相比给出不同的系数?