2017-04-08 119 views
0

我在安裝在窗口上的虛擬機(Linux Ubuntu)中編寫代碼。 據this page,在Linux上的庫CLOCKS_PER_SEC值應始終爲1 000 000
當我運行這段代碼:虛擬機中CLOCKS_PER_SEC值「錯誤」

int main() 
{ 
    printf("%d\n", CLOCKS_PER_SEC); 
    while (1) 
     printf("%f, %f \n\n", (double)clock(), (double)clock()/CLOCKS_PER_SEC); 
    return 0; 
} 

第一個值是1 000 000所應當的,但是,應顯示秒數的值不會以正常速度增加(需要4到5秒才能增加1)
這是否是由於我在虛擬機上工作?我該如何解決這個問題?

+1

你不能使用'clock'自己返回的值,它沒有任何意義。您必須使用兩個呼叫之間的差異。 –

+1

'clock'返回'clock_t'。這不一定是'%f'需要的'double'。 – Olaf

+0

@Someprogrammerdude這是一個旨在測試的代碼。我看單位數字以及它隨着時間的推移如何變化 – Speedphoenix

回答

3

這是預期的。

clock()函數不會返回掛鐘時間(牆上顯示真實時鐘的時間)。它返回程序使用的CPU時間量。如果你的程序沒有消耗所有可能的調度程序片,那麼如果你的程序在多個內核上使用片,同時它可以更快地增加,那麼它將增長得慢於片上時間。

所以,如果你clock(),然後sleep(5),然後再打電話clock(),你會發現,clock()幾乎沒有在所有增加。即使sleep(5)等待5秒鐘,它也不消耗任何CPU,並且CPU使用率是clock()測量的值。

如果你想測量掛鐘時間,你會想要clock_gettime()(或舊版本gettimeofday())。如果您想要知道公民時間(例如「它是3:36 PM」)或CLOCK_MONOTONIC,則可以使用CLOCK_REALTIME如果要測量時間間隔。在這種情況下,您可能需要CLOCK_MONOTONIC

#include <stdio.h> 
#include <time.h> 
int main() { 
    struct timespec start, now; 
    clock_gettime(CLOCK_MONOTONIC, &start); 
    while (1) { 
     clock_gettime(CLOCK_MONOTONIC, &now); 
     printf("Elapsed: %f\n", 
       (now.tv_sec - start.tv_sec) + 
       1e-9 * (now.tv_nsec - start.tv_nsec)); 
    } 
} 

反對使用繁忙循環的通常禁止適用於此處。