[英]Is Observable.Interval useful for high frequency events?
我正在使用Observable.Interval來測試特定的客戶端/服務器代碼在不同負載下的執行情況。
但它似乎有一些奇怪的行為。
Observable.Interval(timespan = 0)
盡可能快地生成事件,例如每秒800萬個事件。 這似乎沒問題。 Observable.Interval(0 < timespan < 1ms)
只產生1個事件,然后什么都沒有。 Observable.Interval(1ms <= timespan)
以大約所請求的速率產生事件,量化很多,最多只能產生64個事件/秒。 我可以理解它不一定使用下面的高分辨率計時器,但令人困惑的是它在三個區域中具有完全不同的行為。
這是預期的行為,還是我使用它錯了? 如果它是預期的,那么是否有一個替代Observable.Interval來模擬Rx中的高頻事件源,或者我應該自己滾動......?
一個演示行為的簡短程序如下:
static void Main(string[] args)
{
const int millisecsPerTest = 10000;
var intervals = new[]
{
TimeSpan.FromTicks(0), // 0 -> rate of 8M messages per second
TimeSpan.FromTicks(1000), // 0.1ms -> rate of 0
TimeSpan.FromTicks(20000), // 2ms -> rate of 64 messages per second (not 500 as expected)
TimeSpan.FromTicks(1000000), // 100ms -> rate of 9 messages per second
};
foreach(var interval in intervals)
{
long msgs = 0;
using (Observable.Interval(interval).Subscribe(
l => { ++msgs; },
e => Console.WriteLine("Error {0}", e.Message),
() => Console.WriteLine("Completed")))
{
Thread.Sleep(millisecsPerTest);
}
Console.WriteLine("Interval: {0} ticks, Events: {1}, Rate: {2} events per second", interval.Ticks, msgs, (int)(msgs/(double)millisecsPerTest*1000));
}
}
是的我認為.net框架計時器使用的時鍾只能以16ms的間隔運行,因此您的結果不會讓我感到驚訝。 雖然你的1滴答間隔測試聽起來像一個bug。 您使用的是什么操作系統,Rx版本.Net版本? 我會看看能不能解決這個問題。
對於0刻度情況,我認為你獲得了高吞吐量,因為Rx調度程序正在檢測工作是“現在”,並且只是立即啟動它並繞過.Net計時器來安排工作。
使用Observable.Create來創建自己的Interval版本相當容易,它使用更高分辨率的計時器。 稍微復雜但最終更有用的是編寫一個使用高分辨率計時器的新IScheduler實現。 然后,您可以將該調度程序傳遞給所有現有的與時間相關的Rx方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.