这段代码很长时间以来一直在修补,因为他稳定而迅速地工作。但似乎无法加快速度。很慢......
for (int jrCnt = rCnt; jrCnt <= arrayTable.GetUpperBound(0); jrCnt++)
{
var prcI = new Price();
/* here is the code search and add data to prcI */
if ((!string.IsNullOrEmpty(prcI.name)) && (prcI.prc != 0))
{ // function add
/* adding more information to prcI */
ThreadPool.QueueUserWorkItem(delegate
{
if (!Accessor.AddProductUpdateProduct(prcI)) _updateCounter++;
_countadd++;
}); // I put the longest function in the streams
}
}
这里我们称之为函数。它运行了很长时间,即使是使用线程池。
public static bool AddProductUpdateProduct(Price price)
{
using (var db = new PriceDataContext())
{
var matchedprod =
db.Price.Where(x => x.name == price.name && x.company == price.company && x.date != price.date);
if (matchedprod.Select(x=>x).Count() > 1)
{
db.Price.DeleteOnSubmit(matchedprod.First());
db.SubmitChanges();
}
var matchedproduct = matchedprod.SingleOrDefault();
if (matchedproduct != null)
{
matchedproduct.date = price.date;
matchedproduct.prc = price.prc;
db.SubmitChanges();
return false;
}
}
/*here the code to add the product to the database.*/
return true;
}
请告诉我如何加快线程池的工作?
答案 0 :(得分:3)
使用单独的线程不会加速任何应用程序。您所做的只是将处理从主线程移动到另一个线程。您需要将处理分解为更小的部分,并将每个部分移动到单独的线程以获得任何性能提升。
然而,在这种情况下它无济于事。这是你的LINQ查询有缺陷。 Enable debugging。查看生成的SQL并修复它们。
<强>其次强>:
if (matchedprod.SingleOrDefault() != null)
{
matchedprod.SingleOrDefault().date = price.date;
matchedprod.SingleOrDefault().prc = price.prc;
db.SubmitChanges();
return false;
}
那将查询数据库三次。每次调用SingleOrDefault时。进行一次查询并将结果存储在变量中。
<强>第三强>:
matchedprod
和matchedprodDel
之间有什么区别?对它们的查询是否相同?
<强>第四强>:
这更容易理解:
var matchedprod = db.Price.Where(x => x.name == price.name && x.company == price.company && x.date != price.date)
答案 1 :(得分:2)
它运行了很长时间,即使使用了线程池。
妄想。如果方法需要10秒,则进出线程需要10秒。线程不会神奇地改变函数的速度。
线程池的作用是它允许你并行运行X方法调用,但它们本身都不会更快。
现在,我将从调用开始 - 看,你有一些SQL不应该超过一毫秒执行,所以如果它很慢,我可以建议过载硬件或一些不那么聪明的人不知道什么是索引,使SQL语句非常慢?
另请注意,除非预先配置,否则线程池会慢慢增加线程 - 比如我认为每秒一次。所以,如果你排队很多......你已经死了。
最后,为什么你使用线程池,而不是任务库?它并不是那么新......并且具有更好的API和对线程的更多控制。
最后,使用分析器找出花费的时间。这并不难。没有探查器的编程就像在没有加热任何东西的情况下做饭一样 - 你的做法有限。专业厨师?使用专业工具。
答案 2 :(得分:0)
通常,首先加速代码涉及使用所谓的“Profiler”。这是一个实际衡量代码执行方式的工具(直到源代码行级别)。
在进行任何优化之前,这应该始终是您的第一步。我自己的经历告诉我,纯粹的猜测通常是错误的。相反,分析帮助我找到了优化的真正瓶颈。
所以我建议你先使用一个分析器,我个人正在使用ANTS Performance Profiler(14天免费试用)来检测你的慢速代码行。