为啥与两者相比得到不同的毫秒值(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 相比给出不同的系数?

从 QTime 继承以自定义时间格式

Ruby:为啥 unpack('Q') 给出的结果与手动转换不同?

与 Vec 相比,为啥 SmallVec 在存储具有生命周期的类型时会有不同的行为?