【问题标题】: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 是你的朋友。稳定时钟使用性能计数器,更容易编写,更便携。

标签: c++ qt performancecounter query-performance


【解决方案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 并保存结果,因为它在系统启动之间不会改变,它只是第一次调用之后的冗余调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多