我继承了一个应用程序,它在针对Server的C# for-循环中执行大约100,000次。
for (int i=0; i<100000; i++)
{
//Execution can take 0.250 to 5 seconds to complete.
ExecuteProc(i); // no result returned
}为了减少执行所有100 000个程序所需的时间,最好是:
发布于 2016-08-27 13:32:37
感觉就像你在试图修复错误的东西。为什么您有100,000次(或者执行相同的一组100,000次)。我敢打赌,只要编写一些更好的SQL,而不需要这种疯狂,就可以解决这个问题。
还有..。如果执行顺序重要,那么并行/异步方法是个坏主意。如果命令重要..。你不能这么做。
发布于 2016-08-28 00:55:15
您应该尝试将循环推入数据库。
将数据库驱动到外部并行执行100,000个操作可能会破坏数据库,而且它很可能不具备以任何合理的方式修复它的知识,因为它没有机会看到更大的问题。
如果您可以将循环推入数据库中,它将(1)最小化往返开销,(2)让数据库有机会看到您要求它解决的问题的全部大小,因此可能会想出一种方法,在这个较大的问题上并行化或使用多个线程。
(我们不知道ExecuteProc做了什么,但如果我们知道了,可以用一个不同的、可能更大、更复杂的存储过程来消除100,000次运行。)
发布于 2016-08-27 12:15:31
ExecuteProc是异步调用吗?如果您正在执行IO (而且web请求是IO),那么生成一个bajillion线程,每个线程都等待同步操作,只是冒着捆绑所有线程的风险,这样它们就无法完成有用的工作。他们都会一直睡到通话结束。
如果您可以访问异步api,那么线程的数量并不是非常重要,因为向SQL服务器发送查询几乎不需要任何CPU工作。
如果您只有一个同步api,那么并行化可以加快速度,但它将需要更多的资源。试一试你的选择,衡量什么最适合你。只有你知道自己的局限性。
https://softwareengineering.stackexchange.com/questions/329499
复制相似问题