我正在開發一個由三個主要軟件組件組成的系統。客戶端應用程序,核心應用程序和交換應用程序都運行在同一臺服務器上。消息在客戶端應用程序接收,轉發到核心應用程序,然後轉發到適當的交換應用程序。如何測量在多核系統上運行的多個應用程序之間的消息延遲?
我想測量我們系統內部的消息延遲,所以在客戶端收到消息時在時間戳上標記,在消息從交換模塊發出時發送時間戳。
使用QueryPerformanceCounter()來跨多個應用程序計時事件是否合理?看來該計數器在運行多個內核的應用程序中不可靠。
我正在開發一個由三個主要軟件組件組成的系統。客戶端應用程序,核心應用程序和交換應用程序都運行在同一臺服務器上。消息在客戶端應用程序接收,轉發到核心應用程序,然後轉發到適當的交換應用程序。如何測量在多核系統上運行的多個應用程序之間的消息延遲?
我想測量我們系統內部的消息延遲,所以在客戶端收到消息時在時間戳上標記,在消息從交換模塊發出時發送時間戳。
使用QueryPerformanceCounter()來跨多個應用程序計時事件是否合理?看來該計數器在運行多個內核的應用程序中不可靠。
如何添加一個交換應用程序,打開一個客戶端連接,然後循環播放一個時間標記的消息,比如10000次。這些延遲會加起來,因此您可以有效地使用牆上時間戳,計算結束開始併除以10000.
這是一個有趣的想法。你是否同意試圖跨多個線程使用QueryPerformanceCounter(),更不用說多個應用程序是不可靠的? – jterm 2013-04-11 15:23:12
正如Chad指出的那樣,QueryPerformanceCounter可以正常工作。來自MSDN「一般來說,即使在不同的線程或進程上測量,多核和多處理器系統中的所有處理器的性能計數器結果(來自QPC)都是一致的。」僅提及幾個例外...
通常,在現代CPU架構上,QueryPerformanceCounter()在線程/進程間是可靠的。請參閱此處的「備註」部分:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904(v=vs.85).aspx – Chad 2013-04-11 16:33:46
我同意@Chad。我對現代多核甚至多處理器計算機的經驗是,QueryPerformanceCounter在任何不到7年的計算機上都是可靠的。早期的多處理器機器(2004年和2005年)我遇到了一些麻煩,但是現代硬件沒有遇到任何問題。 – 2013-04-11 16:51:07
謝謝@乍得/ @吉姆的信息。看來我的測量在各個流程中都是可靠的。好奇的是,我實際上在350-450 usec之間看到了一致的消息延遲。這似乎有點太好了。但是,運行10000次以上的測試我會認爲,如果計數在進程和線程之間不一致,我會在性能計數器中看到巨大的跳轉,甚至報告負面時間。 – jterm 2013-04-15 14:37:13