并行交易软件

时间:2011-07-13 10:14:24

标签: c#

我的交易软件很慢,我想提升它。有两个瓶颈。

第一个瓶颈:

当收到新的数据集(新报价,交易等)时,所有策略都需要尽快更新。他们需要重新计算他​​们的状态/命令等。当准备好读取新的数据集时,调用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毫秒

目前的实施存在两个问题:

  • 它使用一个线程,因此不使用多核处理器
  • strategy.AllTablesUpdated()使用共享资源,可能会被阻止一段时间。如果某个特定策略正在等待资源被释放,那么所有其他策略也在等待(相反,我们可以推迟阻止策略并开始处理其他策略吗?)

第二个瓶颈非常相似:

    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种策略。

如何修改代码来实现?:

  • 如果一个strategyordersExecutor被屏蔽,则其他人不应被屏蔽?
  • 使用多核处理器以及可能是多处理器平台的功能?

1 个答案:

答案 0 :(得分:1)

您的问题相当广泛,您基本上要问的是如何在您的应用程序中使用并行性?您已经将代码分解为离散任务,因此使用并行应该不是一个大问题。我建议阅读有关PLinq和TPL的内容,两者都提供了易于使用的API,用于此类事情:

http://www.codeproject.com/KB/dotnet/parallelism-in-net-4-0.aspx