2013-11-20 73 views
2

我有一個任務,我正在分析各種排序算法的運行時間。我已經編寫了代碼,但我認爲這是一個不公平的比較。有沒有辦法在程序期間暫停OS調度?

我的代碼基本上抓住了排序完成前後的時鐘時間來計算流逝的時間。但是,如果操作系統決定在特定排序算法的運行時間期間更頻繁地中斷,或者如果它確定某個其他後臺應用程序在線程恢復時應該給予更多時間域,該怎麼辦?

我不是CS專業,所以在這裏我可能不完全正確,但從我以前閱讀的內容來看,我擔心這可能會對結果產生影響。

我也意識到,如果操作系統調度被掛起,程序掛起,那麼可能會有一個嚴重的問題;我只是想知道是否有可能。

+2

只需調用排序算法一段時間,然後將最終時間分爲100. –

+0

或者多次運行算法並保持測量的最小(最佳)時間。 –

+0

暫停IO調度?包括頁面錯誤,I/O,一切? –

回答

3

這是不可能的,而不是用戶空間代碼。否則,任何惡意進程都可能會從別人那裏竊取CPU。

如果您只想爲您的過程精確計時,我建議使用time命令。你可以在這裏讀到它:What do 'real', 'user' and 'sys' mean in the output of time(1)?

快速回答:你最有可能感興趣的user時間,假設你的代碼不會使大量使用系統調用(這將是很奇怪的排序算法)

4

通常情況下,沒有真正的理由。調度器會稍微增加執行時間,但如果代碼運行幾秒鐘,則更改將很小。
因此,除非您在同一臺計算機上運行繁重的應用程序,否則這會添加到您的測試中的噪聲量可以忽略不計。

在Linux中,您可以使用isolcpus參數來標記調度程序不會使用的CPU。你可以找到信息here。我不確定最小的內核版本是什麼。
如果你使用它,你需要使用sched_setaffinity,把你的硬盤放在一個隔離的CPU上,因爲調度器不會把它放在那裏。

3

上了最新的POSIX系統(Linux的基本),如果你確保過程不會在CPU之間遷移(你可以設置它例如親和力),可以使用clock_gettimeCLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID

使用這些參數返回的時間差clock_gettime會導致進程/線程執行的確切時間。只有當我提到的缺陷是處理遷移的手冊頁說:

CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID時鐘使用定時器從CPU的許多平臺上實現(TSC在i386,AR.ITC安騰) 。這些寄存器在CPU之間可能會有所不同,因此如果一個進程遷移到另一個CPU,這些時鐘可能會返回假結果

這意味着您並不需要暫停所有其他進程來測量程序的執行時間。

相關問題