程式高效能取時間問題

2021-09-13 00:18:48 字數 1734 閱讀 8808

系統呼叫time底層呼叫的是gettimeofday,因此只需關注gettimeofday的效能,而且不同linux上的gettimeofday會存在效能差異。圍繞gettimeofday的優勢主要基於rdtsc指令,rdtsc和cpu核相關,因此實現時需要處理好多核問題,除非程序和cpu建立親和關係。

並不是每個應用場景需要高精度的時間,如果精度只要求到秒,則可採用更為直接的方式達到高效能取時間的目的。

引用一專門的時間執行緒,這個專門的時間執行緒負責取時間,並提供讀取時間介面。時間執行緒每10ms更新一次時間,即可滿足秒級精度需求。

時間執行緒對時間的讀寫操作採用原子讀寫,開銷低效能高。看乙個基於libmooon的具體實現(實現簡單,其它可參照):

1) 標頭檔案(

)// 提供秒級時間,

// 可用於避免多個執行緒重複呼叫time(null)

// 注:32位平台上的毫秒級不准

classctimethread

;2) 實現檔案(

)singleton_implement(ctimethread);

ctimethread::ctimethread()

: _stop(false),

_interval_milliseconds(1000),

_engine(null)

ctimethread::~ctimethread()

int64_t ctimethread::get_seconds() const

int64_t ctimethread::get_milliseconds() const

void ctimethread::stop()

bool ctimethread::start(uint32_t interval_milliseconds)

catch (sys::csyscallexception& ex)

}void ctimethread::wait()

}void ctimethread::run()

gettimeofday(&exit_tv, null);

if (start_tv.tv_sec<=exit_tv.tv_sec ||

start_tv.tv_usec<=exit_tv.tv_usec)

else

}3) 使用示例:

#include 

// 啟動時間執行緒

mooon::sys::ctimethread::get_singleton()->start(10);

// 取得當前時間(單位:秒)

_now= mooon::sys::ctimethread::get_singleton()->get_seconds();

64位的linux實現了vsyscall,基於vsyscall實現的gettimeofday效能已達每秒千萬級別。vsyscall有侷限性,只允許4個系統呼叫,只能分配較小的記憶體。vdso(virtual dynamic shared object)和vsyscall相同,允許應用在使用者空間(不經過核心)執行一些核心操作,但可提供超過4個系統呼叫,vdso是glibc提供的功能。

要使vdso生效,執行:

echo 1 > /proc/sys/kernel/vsyscall64

參考:1) 

2) 3) 

時間問題3

問題及 檔名稱 main.cpp 作 者 李磊濤 版 本 號 v1.0 問題描述 輸入時間輸出時間。輸入描述 時間時分秒和要增加的時分秒。程式輸出 時間時分秒。includeusing namespace std class time void time add a sec void time ad...

C 時間問題

datetime dt datetime.now 當前時間 datetime startweek dt.adddays 1 convert.toint32 dt.dayofweek.tostring d 本週周一 datetime endweek startweek.adddays 6 本週週日 d...

oracle 時間問題

今天用到oracle時間比較,看到網上也有很多,自己就總結了下啊 1,比較兩個時間的大小 也可以是字串表示時間 select from table where to date 欄位1,yyyy mm dd hh24 mi ss to date 2012 2 8 yyyy mm dd hh24 mi ...