2008-10-28 41 views
57

Tôi đang tìm tương đương trong Qt để GetTickCount()Nhận thời gian trôi qua trong Qt

Cái gì đó sẽ cho phép tôi để đo thời gian cần thiết cho một đoạn mã để chạy như trong:

uint start = GetTickCount(); 
// do something.. 
uint timeItTook = GetTickCount() - start; 

bất kỳ đề xuất nào?

Trả lời

75

Làm thế nào về QTime? Tùy thuộc vào nền tảng của bạn, nó phải có độ chính xác 1 mili giây. Mã sẽ trông giống như sau:

QTime myTimer; 
myTimer.start(); 
// do something.. 
int nMilliseconds = myTimer.elapsed(); 
+1

Trên máy ảo WinXP của tôi, dường như chỉ có độ chính xác 10 ms - bất kỳ ai có thể xác nhận/từ chối điều này không? Tôi nhận được các giá trị 0, 10 và 20 cho một hoạt động mà tôi đang thử nghiệm. –

+3

Windows không chính xác như một hệ điều hành giống UNIX khi thời gian. –

+0

IIRC, trên Windows XP độ phân giải đồng hồ hệ thống báo cáo mặc định là 15ms, nhưng với một số cuộc gọi winapi phụ thuộc vào windows đơn giản, bạn vẫn có thể có độ phân giải tốt hơn nếu chỉ có RMS 1ms hoặc tốt hơn trên bo mạch chủ – quetzalcoatl

103

Tôi nghĩ tốt hơn nên sử dụng QElapsedTimer vì đó là lý do tại sao lớp học tồn tại ở nơi đầu tiên. Nó được giới thiệu với Qt 4.7. Lưu ý rằng nó cũng được miễn dịch thay đổi thời gian đồng hồ của hệ thống.

Ví dụ sử dụng:

#include <QDebug> 
#include <QElapsedTimer> 
... 
... 
QElapsedTimer timer; 
timer.start(); 
slowOperation(); // we want to measure the time of this slowOperation() 
qDebug() << timer.elapsed(); 
34

Thậm chí nếu câu trả lời đầu tiên được chấp nhận, phần còn lại của những người đọc các câu trả lời nên xem xét sivabudh 's đề nghị.
QElapsedTimer cũng có thể được sử dụng để tính thời gian tính bằng nano giây.
Ví dụ mã:

QElapsedTimer timer; 
qint64 nanoSec; 
timer.start(); 
//something happens here 
nanoSec = timer.nsecsElapsed(); 
//printing the result(nanoSec) 
//something else happening here 
timer.restart(); 
//some other operation 
nanoSec = timer.nsecsElapsed(); 
+2

Một lần nữa: Đây là biện pháp thời gian thực, không phải thời gian CPU tiêu thụ bởi quá trình. –

+0

Nó tính toán nó bằng cách lấy số lượng các bộ xử lý bọ ve mà các ứng dụng tiêu thụ và nhân với số nano giây trên mỗi Tick. Nó đo thời gian CPU được tiêu thụ bởi quá trình. –

+0

Nó đo thời gian trôi qua kể từ 'start()', không phải là thời gian mà quá trình tiêu thụ. Đó là một bộ đếm thời gian thực. Khi quá trình được preempted (do đa nhiệm), thời gian tiếp tục vượt qua, và QElapsedTimer sẽ đo lường quá. QElapsedTimer sẽ là khá nhiều vô dụng nếu nó sẽ ngừng đo thời gian khi quá trình này được preempted. –

1

Một chiến lược chung là gọi phương pháp quan sát nhiều lần. 10 cuộc gọi cung cấp độ chính xác 1,5 ms, 100 một trong 0,15 ms.

+0

Điều đó không trả lời được câu hỏi. Anh ta muốn một chức năng để cho anh ta một cách để đo thời gian của các cuộc gọi; bạn đang nói cho anh ta cách giảm lỗi trong một loạt các phép đo. – itsbruce

1

Nếu bạn muốn sử dụng QElapsedTimer, bạn nên xem xét chi phí của lớp này.

Ví dụ, đoạn mã sau chạy trên máy tính của tôi:

static qint64 time = 0; 
static int count = 0; 
QElapsedTimer et; 
et.start(); 
time += et.nsecsElapsed(); 
if (++count % 10000 == 0) 
    qDebug() << "timing:" << (time/count) << "ns/call"; 

mang lại cho tôi kết quả này:

timing: 90 ns/call 
timing: 89 ns/call 
... 

Bạn nên đo này cho chính mình và tôn trọng các nguyên cần thiết cho thời gian của bạn.

+0

Tôi đồng ý. Tôi đã thử QElapsedTimer. Dường như có một số chi phí liên quan đến việc sử dụng lớp. Nhưng rất nhỏ. Sự khác biệt không phải là nhiều. Nhưng QTime dường như cho tôi một chút thời gian thực hiện nhanh hơn. Tôi đã đo mã crunching số của 4 phương pháp (3 lần với QTime và 3 với QElapsedTimer). Bộ đếm thời gian QElapsed đo trung bình 8.046 giây và QTime đo trung bình 8.016 giây, chênh lệch là 30 ms. Không quan trọng đối với hầu hết các mục đích nhưng có lẽ nó là cho độ chính xác tuyệt đối. Điều này đã chạy QT 5.3.1 32 bit trên một máy tính Windows 7 64 bit Intel i5. – te7

+0

Xem chủ đề tại đây http://www.qtcentre.org/threads/62883-Simple-stopwatch-to-time-some-code?p=278558#post278558 – te7

1

Mở rộng các câu trả lời trước đây, đây là macro làm mọi thứ cho bạn.

#include <QDebug> 
#include <QElapsedTimer> 
#define CONCAT_(x,y) x##y 
#define CONCAT(x,y) CONCAT_(x,y) 

#define CHECKTIME(x) \ 
    QElapsedTimer CONCAT(sb_, __LINE__); \ 
    CONCAT(sb_, __LINE__).start(); \ 
    x \ 
    qDebug() << __FUNCTION__ << ":" << __LINE__ << " Elapsed time: " << CONCAT(sb_, __LINE__).elapsed() << " ms."; 

Và sau đó bạn có thể sử dụng đơn giản như:

CHECKTIME(
    // any code 
    for (int i=0; i<1000; i++) 
    { 
     timeConsumingFunc(); 
    } 
) 

đầu ra:

onSpeedChanged: 102 Thời gian đã qua: 2 ms.

Các vấn đề liên quan