2016-05-26 7 views
0

私はクラスCallerAとクラスCalleeBを持っています。
クラスCalleeBにはキューがあり、ジョブは非同期で終了します。
CalleeBenqueue(int input)CallerAコールCalleeB.enqueue(1)CalleeB.enqueue(11)機能を有していれば例えば、入力11の結果は、今入力1
より早く返すことができ、CallerA 10個のCalleeBインスタンスを作成します。
CallerAは、ランダムCalleeBのインスタンスに対して1から5の増分を、ランダムCalleeBのインスタンスでは6から10の増分を入力し、11から15までのように入力します。
CallerAは、CalleeBインスタンスからの結果を受信するコールバックを待機し、1〜5の結果がすべて受信された場合、CallerAは何かを行います。また、CallerAが6から10を受け取った場合、CallerAは何かをします。
もちろん、入力1と入力6は同じCalleeBインスタンスになり、1より前に6が返される可能性があります。
CalleeBからCallerAの計算結果を実装する効率的なテクニックはありますか?異なるインスタンスからの応答数をカウントするコーディングテクニック

答えて

0

CalleeBからCallerAの計算結果 を実装する効率的な手法はありますか?

確かに、CallerAは受け取った結果を追跡しておく必要があります。その結果、5つの結果がすべてセットで受信されると、その結果を処理できます。

私は、CallerAにunordered_map<int, Result>を維持させ、CalleeBから結果を受け取るたびにunordered_mapに配置し、そのセットの他の4つの結果が存在するかどうかを確認する方法がありますunordered_mapの;そうであれば、それらをunordered_mapから削除し、それらを処理する。

また、結果の5項目サブアレイの10項目の配列を保持し、各結果を適切なサブ配列(slotIdx = i%5)の適切なスロット(arrayIdx = i /適切なサブアレイに結果を配置した後、サブアレイのスロットをチェックして、それらがすべてポピュレートされているかどうかを確認するか、そのサブアレイに固有のカウンタをインクリメントすることができますカウンターが5になると、配列は一杯になる必要があります。

+0

コメントありがとうございます!順序付けされていないマップはマップより速いでしょうか? –

+0

少し速く - unordered_mapのルックアップはO(1)で、マップ上ではO(log(N))です。 arrays + countersメソッドを使用する方がどちらの型よりも高速になるでしょう。つまり、あなたが目にしているスケール(50項目)では、違いを測定することはできません。数千から数万のアイテムにスケールアップしようとしていたなら、あなたはそうかもしれません。 –

関連する問題