ブロードキャスト ブロックに渡されるリスト コレクションに問題があります。これが私がこれまでに持っているものです(完全なコードベースが長すぎるため、疑似コードです):
private BroadcastBlock<List<Quote>> tempBCB;
private TransformBlock<List<Quote>, Dictionary<int, IParentOrder>> tfb1;
private TransformBlock<List<Quote>, Dictionary<int, IParentOrder>> tfb2;
private BatchBlock<Dictionary<int, IParentOrder>> batchBlock;
private JoinBlock<List<Quote>, Dictionary<int, IParentOrder>[]> joinBlock;
private TransformBlock<Tuple<List<Quote>,
Dictionary<int, IParentOrder>[]>,List<MySignal>> transformBlock;
tempBCB = new BroadcastBlock<List<Quote>>(quoteList => {
return quoteList;
//return Cloning.CloneListCloneValues<Quote>(quoteList);
});
tfb1 = new TransformBlock<List<Quote>, Dictionary<int, IParentOrder>>(
quotes => {//do something and return Dictionary<int, IParentOrder>});
tfb2 = new TransformBlock<List<Quote>, Dictionary<int, IParentOrder>>(
quotes => {//do something and return Dictionary<int, IParentOrder>});
batchBlock = new BatchBlock<Dictionary<int, IParentOrder>>(2);
joinBlock = new JoinBlock<List<Quote>, Dictionary<int, IParentOrder>[]>(
new GroupingDataflowBlockOptions { Greedy = false });
transformBlock = new TransformBlock<Tuple<List<Quote>,
Dictionary<int, IParentOrder>[]>, List<MySignal>>(
tuple => { //do something and return List<MySignal>;});
//Linking
tempBCB.LinkTo(tfb1);
tempBCB.LinkTo(tfb2);
tfb1.LinkTo(batchBlock);
tfb2.LinkTo(batchBlock);
tempBCB.LinkTo(joinBlock.Target1);
batchBlock.LinkTo(joinBlock.Target2);
joinBlock.LinkTo(transformBlock);
私の問題は、現在の実装でtempBCB
は、最終的に奇妙な結果が得られることTransformBlock<TInput, TOutput>
です。
たとえば、タプルの一部としてのコレクションは、との実装が 100% 同一Dictionary<int, IParentrOrder>
であっても、同じサイズではありません。tfb1
tfb2
実装のコメントアウトされた行はtempBCB
、ブロードキャストされたリストのディープ コピーを実行し、問題を解決しているように見えますが、問題は、このディープ コピーによってコードが約 10 倍遅くなることです。別の解決策。
まず第一に、これが問題なのか、バグがまだそこに隠れていても同時操作が期待どおりに実行される原因なのか、これだけの速度低下なのか、私には絶対にわかりません。
次に、ブロードキャスト ブロックにディープ コピーがないためにこれらの問題が発生する場合、どうすれば高速化できますか?
これが私のディープコピーコードです:
public static List<TValue> CloneListCloneValues<TValue>(List<TValue> original)
where TValue : ICloneable
{
List<TValue> ret = new List<TValue>(original.Count);
foreach (TValue entry in original)
{
ret.Add((TValue)entry.Clone());
}
return ret;
}
Quote[]
ブロードキャスト ブロックの代わりにa をフィードできる可能性List<Quote>
がありますが、ディープ コピーのパフォーマンスを高速化するのにどのように役立つかわかりません。
私の質問は次のとおりです。
- ディープ コピーの問題は、ここでの本当の問題ですか (
List<Quote>
ブロードキャスト ブロックにストリーミングされた は、どの変換ブロックによっても変更されないため、疑いがあります)。 - はいの場合、ディープコピーをより効率的にする理由と方法を教えてください。