2017-10-16 177 views
6

上下文: 我正在編寫一個高性能的C++ 11應用程序,其中的一部分是刪除不活動的連接。爲此,我在我的連接對象中存儲了「最後一次活動」時間戳,在進行操作時我會更新它。然後我有一個計時器,每隔幾秒運行一次,在所有會話中循環,並刪除不活動的計時器。在C++ 11中獲取當前時間的最快方法是什麼?

目前我使用此代碼來獲取當前時間戳:

timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count() 

我不知道是否有任何更快的方式做到這一點?更快的意思是獲得時間戳本身的性能,而不是時間戳的解析度。

對於我的特定應用來說,分辨率並不是很重要,它可能會低至一秒。另外,utc/local無關緊要,我只使用時間戳將其與其他時間戳進行比較,通過相同的方法獲得。

我想保持它的跨平臺,但也歡迎使用條件編譯進行平臺特定的優化。

+7

爲什麼你不簡單''timestamp = system_clock :: now();'? – nwp

+5

您是否測量過時間戳是瓶頸?你有沒有檢查(優化!)生成的機器碼? –

+0

要添加到@nwp,只需檢查'system_clock :: now() - timestamp

回答

5

如果性能確實是一個問題,而準確性不是,那麼您可能根本不需要使用時間戳。而只是爲每個連接保留一個計數器,並且每當連接發生活動時,將計數器重置爲零。每當你的定時器關閉時,讓它增加每個連接的計數器,並斷開任何連接的計數器值高於(N)(無論你發現哪個N值最好)

+1

如果你不想清理任務計時器的精度很重要,讓它記錄自上次運行以來的時間,並通過*那麼多*來增加計數器。現在,您正在生成OP的解決方案的一個體面的近似值,並且只在非性能批評線程上每隔幾秒計算一次*。 – Yakk

0

你可以維護一個線程局部變量線程,併爲每個線程添加一個timerfd(或者您可以使用select/epoll timeout參數)每隔1毫秒喚醒線程,當select/epoll_wait返回時,您調用now()獲取時間戳,並將時間戳保存到線程局部變量。

您也可以使用全局變量,例如std :: atomic,並在select/epoll(在任何線程中)返回時更新它。如果您仍然認爲這是一個瓶頸,請使用帶有timerfd的單線程並每隔1毫秒更新一次時間戳。

相關問題