2012-01-20 15 views
1

私は、RXを頻繁に使用するWP7アプリケーションを構築しており、問題が発生しました。 20 msを超える値をThrottleに追加すると、パフォーマンスが大幅に低下します。ウィンドウの電話7でパフォーマンスが低下するスロットル操作

以下のスニペットは、問題をピンポイント:ここ

var moveObs = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
        h => this.MouseMove += h, 
        h => this.MouseMove -= h); 

// Observe dragging 
var yObs = (from x in moveObs 
      select -(x.EventArgs.GetPosition(this).Y - _initY)); 

var result = yObs.SkipWhile(y => !_isDragging) 
       .Throttle(TimeSpan.FromMilliseconds(33)); 

result.TimeInterval() 
     .Subscribe(x => Debug.WriteLine("Mouse move interval: " + x)); 

は、スニペットの出力です:私の理解スロットルにそう

'UI Task' (Managed): Loaded 'Microsoft.Devices.Sensors.dll' 
The thread '<No Name>' (0x1e18) has exited with code 0 (0x0). 
Mouse move interval: [email protected]:00:04.1920000 
Mouse move interval: [email protected]:00:00.2900000 
Mouse move interval: [email protected]:00:00.6710000 
The thread '<No Name>' (0x22a4) has exited with code 0 (0x0). 
Mouse move interval: [email protected]:00:01.0460000 
The thread '<No Name>' (0x2514) has exited with code 0 (0x0). 
Mouse move interval: [email protected]:00:00.3250000 
The thread '<No Name>' (0x270c) has exited with code 0 (0x0). 
Mouse move interval: [email protected]:00:12.1420000 
The thread '<No Name>' (0x186c) has exited with code 0 (0x0). 
Mouse move interval: [email protected]:00:01.4860000 

は、スレッドプールとウォンからスレッドを作成しますUIをブロックして、それは非常に効率的でなければならないでしょうか?

質問 なぜパフォーマンスが遅いのですか?私はRXの初心者ですので、おそらくここで何か不足しています。

編集

ここで同じ問題を再現する別のサンプルです:

var oneNumberPerSecond = Observable.Interval(TimeSpan.FromMilliseconds(10)); 

var lowNums = from n in oneNumberPerSecond 
       select n; 


lowNums.Throttle(TimeSpan.FromMilliseconds(100)) 
     .TimeInterval() 
     .Subscribe(lowNum => Debug.WriteLine(lowNum)); 

が、これはしかし、それはいずれも印刷されない、100ミリ秒ごとに番号を印刷する必要があります私の理解では。

答えて

2

それは遅いわけではありません - あなたが説明したことはまさにスロットルの動作です。

ストリームが指定された期間の値の生成を停止すると、Throttleによって値が生成されます。

は私があなたのREPROを打破してみましょう:

var oneNumberPerSecond = Observable.Interval(TimeSpan.FromMilliseconds(10)); 

これは、値ごとに10ミリ秒を生成する観測可能寒いです。

var lowNums = from n in oneNumberPerSecond 
       select n; 

これは実際には何もしません。これはlowNumsストップが100msecsの値を生成するたびに値を生成しますストリームを生成oneNumberPerSecond.Select(i => i)

lowNums.Throttle(TimeSpan.FromMilliseconds(100)) 

に相当します。しかし、lowNumsは10ミリ秒ごとに値を生成するので、100ミリ秒間何も起こらない時間はありません。

+0

「スロットル」はこの方法のベストネームではありません。 – Asti

+0

あなたは絶対的です、私はそれをサンプルと混ぜました。しかし、実際にはパフォーマンスの問題はまだ存在する、私はこれは私が持っているものと非常に似た問題だと思う:http://social.msdn.microsoft.com/Forums/en-US/rx/thread/e6824c74-9c23-421f -bc25-81305b0e2a22/ – Vitalij

+0

@Asti - BTW、 'Interval'は** cold ** observablesを生成します。 – Enigmativity

関連する問題