2009-07-14 70 views
1

我正在運行一些分析測試,而usleep是一個有用的功能。但是,當我的程序正在休眠時,這個時間不會出現在配置文件中。如何進行主動睡眠?

例如。如果我有一個功能:

void f1() { 
    for (i = 0; i < 1000; i++) 
     usleep(1000); 
} 

隨着文件的工具gprof的,F1似乎並不花費任何時間。

我尋找一個方法不是空更好while循環做積極的睡眠,如:

while (1) { 
    if (gettime() == whatiwant) 
     break; 
} 
+0

感謝您的回覆。也許它不是很清楚,但我不在乎效率,我正在運行一些測試(實際上,我將在test.c文件中使用它)。我知道等待隊列調度等等。我正在尋找的是我更新的現有方法。 – 2009-07-14 14:59:54

回答

2

一個什麼樣的系統是你嗎?在類UNIX系統中,您可以使用setitimer()在指定的時間段之後向進程發送信號。這是您需要實施您正在尋找的「主動睡眠」類型的工具。

設置計時器,然後循環直到收到信號。

2

因爲當你調用usleep CPU被投入到工作中,以1秒別的東西。所以當前線程不使用任何處理器資源,這是一個非常聰明的事情。

積極的睡眠是絕對避免的,因爲它浪費了資源(最終通過將電能轉化爲熱量來損壞環境))。

無論如何,如果你真的想這麼做,你必須對處理器做一些真正的工作,這些東西不會被編譯器優化所分解。例如

for (i = 0; i < 1000; i++) 
    time(NULL); 
2

我假設你想找出的時間總量(掛鐘時間,真實世界的時間,到時候你坐在那兒看你的應用程序運行)F1()走,而不是到CPU時間。我會調查一下,看看gprof是否能給你一個掛鐘時間而不是處理時間。

我想它取決於你的操作系統,但是你沒有看到在配置文件中佔用任何進程時間的原因是因爲它在技術上沒有在那段時間使用任何其他正在運行的進程(假設這是在* nix平臺上運行)。

+0

我認爲你的意思是實時/掛鐘時間。睡覺不應該使用用戶時間。 – Nick 2009-07-14 13:52:44

+0

@Nick - 對。編輯。 – 2009-07-14 14:52:09

+0

嗯,很好的迴應。已經在gprof中搜索過,這是不可能的。 – 2009-07-14 15:01:55

1
for (int i = i; i < SOME_BIG_NUMBER; ++i); 

「睡眠」功能的全部重點在於您的應用程序未運行。它被放入睡眠隊列中,操作系統將控制轉移到另一個進程。如果你想讓你的應用程序運行,但什麼也不做,空循環是一個簡單的解決方案。但你失去了睡眠的所有好處(讓其他應用程序運行,節省CPU使用率/功耗)

所以你問的是沒有意義的。你不能讓你的應用程序休眠,但仍然在運行。

0

AFAIK唯一的選擇是做一個while循環。操作系統通常假定,如果您想等待一段時間,您將希望屈服於操作系統。

能夠獲得微秒準確的計時器也是一個潛在的問題。 AFAIK沒有一個跨時代的做時機的方式(請有人糾正我,因爲我喜歡跨平臺的亞微秒計時器!:D)。在Win32下,當你在循環中花費足夠的時間然後退出時,你可以用一些QueryPerformanceCounter調用來包圍一個循環來計算出來。

e.g

void USleepEatCycles(__int64 uSecs) 
{ 
    __int64 frequency; 
    QueryPerformanceFrequency((LARGE_INTEGER*)&frequency); 
    __int64 counter; 
    QueryPerformanceCounter((LARGE_INTEGER*)&counter); 

    double dStart = (double)counter/(double)frequency; 
    double dEnd = dStart; 
    while((dEnd - dStart) < uSecs) 
    { 
     QueryPerformanceCounter((LARGE_INTEGER*)&counter); 
     dEnd = (double)counter/(double)frequency; 
    } 
} 
0

這就是爲什麼分析查看「切換出來的%」時間非常重要。基本上,雖然你的功能的獨佔時間可能很少,但如果它執行例如I/O,數據庫等,等待外部資源,然後「切換%」是要注意的指標。

0

這是你用gprof得到的那種困惑,因爲你關心的是掛鐘時間。我使用this