多线程应用程序的自动重置事件的性能

时间:2015-03-13 10:49:19

标签: c# multithreading performance trading

我开发了一个基于股票交易的金融服务应用程序。应用背后的想法是执行多个符号/划线的各种计算,并同时为每个符号生成买卖信号。每秒从数据供应商接收数据,然后执行计算。

背景 为此,我创建了一个计算类,它将接收单个符号的数据并执行计算并生成买/卖信号。

要对多个符号执行计算,我在每个符号的单独线程中实例化计算对象,如此

    EventWaitHandle ew = new AutoResetEvent(initialState: false);
    Thread t = new Thread(() => RunCalculations(s));
    _waitList.Add(s.Symbol, ew);
    t.Name = s.Symbol;
    t.Start();
    threadList.Add(s.Symbol, t);

上面的代码通过foreach在每个符号上进行迭代。 这就是RunCalculations();

    private void RunCalculations(Symbols symbol)
    {
        Calculations calc = new Calculations(symbol);
        while (true)
        {
            _waitList[symbol.Symbol].WaitOne();
            if(!keepRunning[symbol.Symbol])
            {
                calc.Stop();
                return;
            }
            MarketData d = null;
            if(_mktDataQueue.TryDequeue(out d))
            {
                if (calc.SymbolName == d.Symbol)
                    calc.AddTickItem(d);
            }
        }
    }

calc.AddTickItem()将仅发送属于某个线程的一个符号的数据值。进一步的计算在Addtickitem对象的calc方法内调用。

通过AutoResetEvent,Iam在另一个方法中添加一个数据项,在每个线程上调用_waitList[data.Symbol].Set();

问题 计算工作正常。但问题在于添加更多线程(或符号)时的性能。我们测试了极限并发现,它只能在大约18 - 20个符号上正常工作。如果我们增加更多,那么计算部分将在市场营业时间结束前半小时推迟。但直到那个时候,它运作良好。另一个问题是,这并不是每天都会发生的。我们已经测试了多达28个符号并返回到19个符号,现在它已经稳定运行。

据我所知,由于Iam使用事件信令,因此对CPU来说不应该是更多的资源。 CPU实际上是一款2核intel i3处理器。

但我仍然想知道,如果它是处理器的问题,还是应该改变应用程序的架构?我想过改变线程管理的架构而不是符号,我会把每个计算部分放在不同的线程中。但问题是,有一些依赖计算,邪恶的并发同步;)让我做噩梦。

我将改变处理器,但我必须知道什么是最佳处理器(4核,8核等)。据我所知,只有核心无法解决问题。

任何建议都将不胜感激。

感谢。

0 个答案:

没有答案