使用ThreadPool的优化程序。 C#

时间:2012-01-09 06:35:11

标签: c# optimization threadpool

这段代码很长时间以来一直在修补,因为他稳定而迅速地工作。但似乎无法加快速度。很慢......

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;
}

请告诉我如何加快线程池的工作?

3 个答案:

答案 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时。进行一次查询并将结果存储在变量中。

<强>第三

matchedprodmatchedprodDel之间有什么区别?对它们的查询是否相同?

<强>第四

这更容易理解:

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天免费试用)来检测你的慢速代码行。