我的交易软件很慢,我想提升它。有两个瓶颈。
第一个瓶颈:
当收到新的数据集(新报价,交易等)时,所有策略都需要尽快更新。他们需要重新计算他们的状态/命令等。当准备好读取新的数据集时,调用AllTablesUpdated
方法。此方法为每个特定策略调用AllTablesUpdated
方法。
public void AllTablesUpdated()
{
Console.WriteLine("Start updating all tables.");
foreach (Strategy strategy in strategies)
{
strategy.AllTablesUpdated();
}
Console.WriteLine("All tables updated in " + sw.ElapsedMilliseconds);
}
结果推迟。有时它需要0或1毫秒(非常好),有时需要8-20毫秒,但有时需要800毫秒
目前的实施存在两个问题:
第二个瓶颈非常相似:
private OrdersOrchestrator()
{
// A simple blocking consumer with no cancellation.
Task.Factory.StartNew(() =>
{
while (!dataItems.IsCompleted)
{
OrdersExecutor ordersExecutor = null;
// Blocks if number.Count == 0
// IOE means that Take() was called on a completed collection.
// Some other thread can call CompleteAdding after we pass the
// IsCompleted check but before we call Take.
// In this example, we can simply catch the exception since the
// loop will break on the next iteration.
try
{
ordersExecutor = dataItems.Take();
}
catch (InvalidOperationException) { }
if (ordersExecutor != null)
{
ordersExecutor.IssueOrders();
}
}
});
}
ordersExecutor
可能会等到某些资源被释放。如果是这样,则所有其他ordersExecutors
都被阻止。
详细信息:每个strategy
包含一个ordersExecutor
,他们使用共享资源。 strategy.AllTablesUpdated()
可能会等待ordersExecutor
释放资源,反之亦然。如果出现这种情况,则所有其他stretegies/ordersExecutors
也会被阻止。有超过100种策略。
如何修改代码来实现?:
strategy
或ordersExecutor
被屏蔽,则其他人不应被屏蔽?答案 0 :(得分:1)
您的问题相当广泛,您基本上要问的是如何在您的应用程序中使用并行性?您已经将代码分解为离散任务,因此使用并行应该不是一个大问题。我建议阅读有关PLinq和TPL的内容,两者都提供了易于使用的API,用于此类事情:
http://www.codeproject.com/KB/dotnet/parallelism-in-net-4-0.aspx