簡體   English   中英

是Observable.Interval對高頻事件有用嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM