我对传递到广播块的列表集合有疑问。这是我到目前为止所拥有的(伪代码,因为完整的代码库太长了):
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
我在 final 中得到了奇怪的结果TransformBlock<TInput, TOutput>
。
例如,Dictionary<int, IParentrOrder>
作为元组一部分的集合大小不相等,即使实现tfb1
和tfb2
100% 相同。
实现中被注释掉的行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;
}
我可能会将 aQuote[]
而不是馈List<Quote>
入广播块,但我看不出它如何有助于加快深度复制的性能。
我的问题是:
- 深拷贝问题是这里的真正问题吗(我怀疑,因为
List<Quote>
任何转换块都不会改变流入广播块的 , )? - 如果是,为什么以及如何使深层副本更有效?