2012-05-02 30 views
0

如何測量創建和啓動線程所需的時間? (Linux,pthreads或boost :: thread)。創建線程所需的測量時間

感謝您的建議!

+0

你想通過這個實現什麼?希望你沒有嘗試一些優化,因爲你無法想象這樣的優化。 –

+0

我需要在非常規基礎上執行一些操作 - 在30 ms後調用函數X,在15 ms後調用函數Y,在60 ms後調用Z.這個函數應該在隊列中發送消息。 – rimas

回答

2

你或許應該指定要測量什麼,因爲至少有2種可能的解釋(原線程是「忙」裏pthread_create隨時間與調用pthread_create直到另一個線程實際執行的第一條指令的時間)。

在這兩種情況下,你可以使用clock_gettimeCLOCK_MONOTONIC前後調用pthread_create或呼叫之前和線程功能可按內部後的第一件事查詢單調的實時性。然後,從第一個減去第二個值。

要知道在phtread_create裏面花了些什麼時間,CLOCK_THREAD_CPUTIME_ID是一種替代方法,因爲這隻能計算您的線程使用的實際時間。

總而言之,測量這種事情有點沒有意義。它告訴你幾乎沒有任何問題關於它將如何在您的系統或其他系統的實際情況下運行,具有未知進程以及未知的調度策略和優先級。
在另一臺機器上,或在另一天,您的線程可能只是在100或200毫秒後安排。如果你依靠這種事情不會發生,那麼你就死定了。

編輯:
關於上述評論添加的信息,如果你需要的規模是內「通常調度量程」以及「執行非定期的行動」,你可以創建一個線程和nanosleep 15或30毫秒。當然,睡眠不是非常準確或可靠,所以你可能想要阻止timerfd(如果可移植性不是最高優先級,則使用信號傳遞計時器)。
使用單個定時器/等待計劃不規則間隔也不是什麼大問題,您只需要跟蹤事件到期的時間。這就是現代操作系統也是這樣做的(閱讀「定時器合併」)。

+1

..並且在許多應用程序中,只是N/A,因爲這是啓動時的一次性成本。 –

+0

@MartinJames:對於使用(非內核)aio,getaddrinfo_a或libunbound或類似應用程序(所有這些應用程序在不可預知的時間產生線程)的應用程序,它只是非常有趣(如果有的話)。然後,無論如何,你無能爲力...... – Damon