当前位置: 首页 > 编程语言 > C#

Threadpool程序在更快的服务器上运行得慢得多分享

时间:2023-04-10 12:50:42 C#

C#学习教程:线程池程序在更快的服务器上运行得更慢我认为使用2个处理器时我的程序执行速度较慢可能是因为两个处理器需要相互“通信”。我需要做一些测试。我将尝试禁用其中一个处理器,看看会发生什么。=======================================我不确定这是不是C#问题,可能更多关于硬件,但我认为C#是最合适的。我使用便宜的DL120服务器,我决定升级到更昂贵的2处理器DL360p服务器。令人惊讶的是,我的C#程序在新服务器上运行速度慢了大约2倍,而新服务器应该快几倍。我处理来自大约60种仪器的FAST数据。我为每个乐器创建了单独的任务,如下所示:BlockingCollectionupdatesQuery;如果(instrument2OrderUpdates.ContainsKey(instrument)){updatesQuery=instrument2OrderUpdates[instrument];}else{updatesQuery=newBlockingCollection();instrument2OrderUpdates[instrument]=更新查询;ScheduleFastOrdersProcessing(更新查询);}orderUpdate.Checkpoint("updatesQuery.Add");updatesQuery.Add(orderUpdate);}privatevoidScheduleFastOrdersProcessing(BlockingCollectionupdatesQuery){Task.Factory.StartNew(()=>{Instrumentinstrument=null;OrderBookorderBook=null;intlastRptSeqNum=-1;while(!updatesQuery.IsCompleted){OrderUpdateorderUpdate;try{orderUpdate=updatesQuery.Take();}catch(InvalidOperationExceptione){Log.Push(LogItemType.Error,e.Message);继续;}orderUpdate.Checkpoint("从updatesQuery.Take()收到");.........................................................//长的不感兴趣的处理代码},TaskCreationOptions.长时间运行);因为我大约有60个任务可以并行执行,所以我预计2*E5-2640(24个虚拟线程,12个真实线程)执行速度比1*E3-1220(4个真实线程)似乎使用DL360p我在任务管理器中发现了95个线程。使用DL120我只有55个线程。但是DL120G7的执行时间快了2倍(!!)!E3-1220的时钟比E5-2640好一点(3.1GHz对2.5Ghz),但我仍然希望我的代码在2*E5-2640上运行得更快,因为它并行化得更好,我绝对不期望它工作速度慢2倍!HPDL120G7E3-1220任务管理器中的~50个线程最佳=24平均~80微秒调用market.UpdateFastOrder=23updatesQuery.Add=25从updatesQuery.Take()接收=67inorderbook=80调用市场.UpdateFastOrder=30updatesQuery。Add=32从updatesQuery.Take()=64inorderbook=73callingmarket.UpdateFastOrder=31updatesQuery.Add=32从updatesQuery.Take()=195inorderFasterbook=204caldate=31updatesQuery.Add=32从updatesQuery.Take()=74inorderbook=86callingmarket.UpdateFastOrder=18updatesQuery.Add=21receivedfromupdatesQuery.Take()=65inorderbook=78callingmarket.Update29FastOrder=updatesQuery.Add=32receivedfromupdatesQuery.Take()=76inorderbook=88调用market.UpdateFastOrder=30updatesQuery.Add=32从updatesQuery.Take()接收=80inorderbook=92callingmarket.UpdateFastOrder=20updatesQuery.Add=21receivedfromupdatesQuery.Take()=65inorderbook=78callingmarket.UpdateFastOrder=21updatesQuery.Add=24receivedfromupdatesQuery.Take()=68在订单簿中=81调用market.UpdateFastOrder=12updatesQuery.Add=13从updatesQuery.Take()接收=58在订单簿中=72调用市场.UpdateFastOrder=22updatesQuery.Add=23从updatesQuery.Take()接收=51在订单簿=59调用market.UpdateFastOrder=16updatesQuery.Add=16从updatesQuery.Take()收到=20在订单簿=24调用market.UpdateFastOrder=28updatesQuery.Add=31从updatesQuery.Take()收到=82在订单簿=94调用market.UpdateFastOrder=18updatesQuery.Add=21从updatesQuery.Take()接收=65inorderbook=77调用market.UpdateFastOrder=29updatesQuery.Add=29从updatesQuery.Take()接收=259inorderbook=264调用市场.UpdateFastOrder=49updatesQuery.Add=52从updatesQuery.Take()接收=99inorderbook=113callingmarket.UpdateFastOrder=22updatesQuery.Add=23receivedfromupdatesQuery.Take()=50inorderbook=60callingmarket.UpdateFastOrder=29updatesQuery.Add=32从updatesQuery.Take()收到=76在订单簿=88调用market.UpdateFastOrder=16updatesQuery.Add=19从updatesQuery.Take()收到=63在订单簿=75调用market.UpdateFastOrder=27updatesQuery.Add=27从updatesQuery.Take()=226inorderbook=231callingmarket.UpdateFastOrder=15updatesQuery.Add=16receivedfromupdatesQuery.Take()=35inorderbook=42callingmarket.UpdateFastOrder=18updatesQuery.Add=21receivedfromupdatesQuery.Take()=66inorderbook=78HPDL360pG82*E5-2640任事管理器中约95个线程;最佳=40平均~150微秒调用market.UpdateFastOrder=62updatesQuery.Add=64receivedfromupdatesQuery.Take()=144inorderbook=205callingmarket.UpdateFastOrder=27updatesQuery.Add=32从updatesQuery.Take()收到=101inorderbook=154调用market.UpdateFastOrder=45updatesQuery.Add=50从updatesQuery.Take()收到=124inorderbook=187调用market.UpdateFastOrder=46updatesQuery.Add=51从updatesQuery.Take()接收=127inorderbook=162调用market.UpdateFastOrder=63updatesQuery.Add=68从updatesQuery.Take()接收=137inorderbook=174调用market.UpdateFastOrder=53updatesQuery.Add=55从updatesQuery.Take()=133inorderbook=171callingmarket.UpdateFastOrder=44updatesQuery.Add=46receivedfromupdatesQuery.Take()=131inorderbook=158调用市场。UpdateFastOrder=37updatesQuery.Add=39从updatesQuery.Take()接收=102inorderbook=140callingmarket.UpdateFastOrder=45updatesQuery.Add=50receivedfromupdatesQuery.Take()=115inorderbook=154callingmarket.UpdateFastOrder=50updatesQuery.Add=55从updatesQuery.Take()=133inorderbook=160callingmarket.UpdateFastOrder=26updatesQuery.Add=50receivedfromupdatesQuery.Take()=99inOrderUpdatemarket.cald=14updatesQuery.Add=30receivedfromupdatesQuery.Take()=36inorderbook=40<--我能在数千个中找到的最好的一个你能明白为什么当服务器快几倍慢2倍时我的程序运行得更快吗?可能我不应该创建~60个任务?也许我应该告诉.NET不要使用95个线程,而是限制在50个甚至24个?也许这是2个处理器与1个处理器的配置问题?可能只是禁用我的DL360PGen8上的其中一个处理器会显着加快程序速度吗?添加只是因为你有一个可以处理更多多线程的系统,这并不意味着所有这些线程都可以完全并行处理当我从四核CPU升级到i7(虚拟8核)时,我注意到使用的多线程多于内核该设置会导致线程在一段时间内相互阻塞,从而导致整个系统变慢。问题只是我的algorythims已经能够使用其线程运行的内核的全部处理时间,而等待线程只工作了大约5%到10%,这导致主线程完成但一些单线程仍然有完成他们所有的工作(同样花费相同的时间)。线程池只会在所有工作人员完成后继续,因此完成之前的总时间将是其他线程未完成的处理器时间。也许您只需要找到最佳线程数。以上是C#学习教程:Threadpool程序在速度更快的服务器上运行速度慢得多。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: