2010-09-24 82 views
4

我正試圖在Redhat Linux上優化我們的gettimeofday()系統調用。 通過他們的文檔,它可以通過使用虛擬動態共享對象(VDSO)在用戶區域運行呼叫來加快速度。我很好奇,我怎樣才能確定電話的速度呢?我想做出改變,然後比較對我的以前的結果測量系統調用速度

+0

我不知道如何系統調用在用戶空間中運行,或有什麼可以做,以充分優化嗎......?我的理解是,VDSO只是讓內核可以公開在當前處理器上運行系統調用的首選方式(使用'int 80h'或'sysenter' /'syscall'),並跟蹤其他一些內務處理細節。 – Doug 2010-09-24 13:32:19

+0

在glibc運行時庫中實現了一個虛擬動態共享對象(VDSO)。 VDSO映射一些內核代碼,這是讀取用戶空間中的gettimeofday所必需的。標準紅帽企業版Linux 5.1允許gettimeofday函數完全在用戶空間中執行 ,消除系統調用開銷。 – Ananymous 2010-09-24 13:34:52

+0

謝謝,這絕對有趣 - 我想到了這種可能性,但沒有意識到它實際上已經完成。似乎內核在發生上下文切換時將處理器的時間戳記計數器(RDTSC)和時間存儲在VDSO頁面中,這使得glibc可以計算一天中的時間,而無需實際進行系統調用。 – Doug 2010-09-24 13:44:07

回答

6

僞代碼:

  1. 呼叫gettimeofday()和保存導致a
  2. 呼叫gettimeofday()一百萬次
  3. 呼叫gettimeofday()並保存結果在b
  4. 計算(b-a)/1,000,000

原理:對gettimeofday()的兩個邊界調用不應對循環產生太大影響。調用你想要的功能可能會感覺很奇怪,但沒關係。

+1

+1常識勝。 – 2010-09-24 13:53:17

1

如果您在英特爾平臺IAPerf.H上有一些宏,可以使高分辨率的計時變得簡單明瞭。

PERFINITMHZ(1200) // Set the clockspeed of your processor 
    PERFSTART 
    gettimeofday(); 
    PERFSTOP 
    PERFREPORT 

它使用Time Stamp Register所以你避免SYS通話費用,以獲得時間並獲得精確的時序。如果結果不夠充分,您可能仍然希望調用gettimeofday一百萬次,並將結果分開。