系統呼叫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 ...