并行调用的启动时间太长
本文关键字:时间 启动 调用 并行 | 更新日期: 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毫秒。我现在正在跟上数据传输。
查尔斯