Skip to content

TimeInterval

1. 概要

TimeInterval は、ソースシーケンスの各要素に、前回の値(または購読開始)からの経過時間(TimeSpan)を付加するオペレーターです。各要素は (TimeSpan Interval, T Value) のタプルとして発行されます。

値の到着間隔を計測したい場合(パフォーマンスモニタリング、イベント頻度の分析など)に使用します。

2. シグネチャ

デフォルト TimeProvider による経過時間付加

csharp
public static Observable<ValueTuple<TimeSpan, T>> TimeInterval<T>(
    this Observable<T> source)

デフォルトの TimeProvider を使用して、各要素に前回からの経過時間を付加します。

csharp
source.TimeInterval()

TimeProvider 指定による経過時間付加

csharp
public static Observable<ValueTuple<TimeSpan, T>> TimeInterval<T>(
    this Observable<T> source,
    TimeProvider timeProvider)

指定した TimeProvider を使用して経過時間を計測します。テスト時に FakeTimeProvider を使用可能です。

csharp
source.TimeInterval(fakeTimeProvider)

overload の使い分け

overload使う場面
引数なし通常の経過時間計測
TimeProviderユニットテストで時間を制御したい場合

3. マーブルダイアグラム

TimeInterval のマーブルダイアグラム

各要素に、前回の値からの経過時間が付加されます。最初の要素には購読開始からの経過時間が付加されます。

4. サンプルコード

csharp
using R3;

// クリック間隔の計測
clickObservable
    .TimeInterval()
    .Subscribe(item =>
    {
        var (interval, click) = item;
        Console.WriteLine($"前回から {interval.TotalMilliseconds}ms 経過");
    });

// 値の到着間隔が閾値を超えたら警告
sensorObservable
    .TimeInterval()
    .Where(item => item.Item1 > TimeSpan.FromSeconds(10))
    .Subscribe(item =>
    {
        Console.WriteLine($"警告: データの間隔が {item.Item1.TotalSeconds}秒 に開きました");
    });

5. 補足

Timestamp との違い

オペレーター付加する値用途
Timestamp各値の到着時刻(ticks)(long, T)絶対時刻の記録
TimeInterval前回からの経過時間(TimeSpan, T)間隔の計測

Timestamp は絶対的な時刻情報を付加するのに対し、TimeInterval は相対的な経過時間を付加します。

フレームベースの類似オペレーターとして FrameInterval があります。