【发布时间】: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) 它返回signedint; 2)它“如果任一时间无效,则可以返回0”(可以用QTime::isValid()检查) -
我认为您在这种情况下对 QTime 的使用是不正确的。 QTime 仅提供毫秒精度的挂钟时间,它并非设计为高分辨率稳定时钟。
-
std::chrono是你的朋友。稳定时钟使用性能计数器,更容易编写,更便携。
标签: c++ qt performancecounter query-performance