并行调用的启动时间太长

本文关键字:时间 启动 调用 并行 | 更新日期: 2023-09-27 18:09:08

我需要一些建议。我有一个应用程序,处理交易信息从实时数据饲料从股票交易所。我的处理落后了。

因为我在3GHz的英特尔I7上运行,32 gb的主存,我应该有足够的能力来做这个应用程序。Parse例程将交易信息存储在SQL Server 2014数据库中,运行在Windows 2012 R2服务器上。

我在主处理循环中放置了以下计时信息:

  invokeTime.Restart();
  Parallel.Invoke(() => parserObj.Parse(julian, data));
  invokeTime.Stop();
  var milliseconds = invokeTime.ElapsedMilliseconds;
  if (milliseconds > maxMilliseconds) {
    maxMilliseconds = milliseconds;
    messageBar.SetText("Invoke: " + milliseconds);
  }

我得到了1122毫秒来执行Parallel.Invoke。一个类似的计时测试显示Parse例程只需要7毫秒(最多)。

是否有更好的方法来处理数据,而不是做Parallel.Invoke?

如有任何建议,我将不胜感激。

查尔斯

并行调用的启动时间太长

你试过了吗

Task.Factory.StartNew(() => {
 parserObj.Parse(julian, data));
});

你的Parse方法是什么样子的?也许瓶颈就在那里……

在Stephen Toub的文章:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx中他描述:"任务。Run可以而且应该用于最常见的情况,即简单地卸载一些要在ThreadPool上处理的工作。这正是我想要做的,将Parse例程卸载到后台线程。所以我改成:

Parallel.Invoke(() => parserObj。解析(julian数据));

:

Task.Run(() => parserObj。解析(julian数据));

我还通过以下操作将ThreadPool中的线程数从8增加到80:

    int minWorker, minIOC;;
    ThreadPool.GetMinThreads(out minWorker, out minIOC);
    var newMinWorker = 10*minWorker;
    var newMinIOC = 10*minIOC;
    if (ThreadPool.SetMinThreads(newMinWorker, newMinIOC)) {
      textBox.AddLine("The minimum no. of worker threads is now: " + newMinWorker);
    } else {
      textBox.AddLine("Drat! The minimum no. of worker threads could not be changed.");
    }

解析循环每天运行6.5小时,如下所示:

    var stopWatch = new Stopwatch();
    var maxMilliseconds = 0L;
    while ((data = GetDataFromIQClient()) != null) {
      if ( MarketHours.IsMarketClosedPlus2() ) {
        break;
      }
      stopWatch.Restart();
      Task.Run(() => parserObj.Parse(julian, data));
      stopWatch.Stop();
      var milliseconds = stopWatch.ElapsedMilliseconds;
      if (milliseconds > maxMilliseconds) {
        maxMilliseconds = milliseconds;
        messageBar.SetText("Task.Run: " + milliseconds);
      }
    }

现在,调用Task的最大时间。运行时间为96毫秒,在解析器上花费的最长时间为18毫秒。我现在正在跟上数据传输。

查尔斯