2012-01-09 8 views
2

このコードvozhusで、彼は着実に、そして急速に働いていたのです。しかし、それをスピードアップするように見えることはできません。遅いです...ThreadPoolを使用した最適化プログラム。 C#

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

それはあなたがあなたのコードで何をしようとしている本当に何ですか?まず、いくつかの項目のデータコンテキストを照会します。 _返されたアイテム数が1より大きい場合は、データコンテキスト_again_を照会して最初のアイテムを取得します。その後、元のクエリで 'SingleOrDefault()'を実行して何かするのですか?これはまったく意味がありません...まず最初に、同じクエリを2回実行するのはなぜですか?第2に、あなたが最初のif文を入力すると、2番目のif文を入力することはありません...そして、 'matchedprod.Count()'が> 2の場合はどうなりますか?あなたは1つのアイテムだけを削除しますか?非常に多くの質問... – Nailuj

答えて

3

別のスレッドを使用してもアプリの速度は向上しません。あなたは、プライマリスレッドから別のスレッドに処理を移すだけです。パフォーマンスを向上させるには、処理を小さな部分に分割し、各部分を別のスレッドに移動する必要があります。

ただし、この場合は役に立ちません。欠陥のあるLINQクエリです。 Enable debugging。生成されたSQLを見て修正してください。第二に

:データベースを3回照会します

if (matchedprod.SingleOrDefault() != null) 
{ 
    matchedprod.SingleOrDefault().date = price.date; 
    matchedprod.SingleOrDefault().prc = price.prc; 

    db.SubmitChanges(); 
    return false; 
} 

。 SingleOrDefaultへの呼び出しごとに1回。 1つのクエリを実行し、その結果を変数に格納します。

第三は:

matchedprodmatchedprodDelの違いは何ですか?それらのクエリは等しいですか?

フォース

これは読みやすいです:

var matchedprod = db.Price.Where(x => x.name == price.name && x.company == price.company && x.date != price.date) 
+0

ご協力いただきありがとうございます。あなたが言ったようにしました。しかし、レートは、残念ながら増加していません。 – JinDeveloper

+0

私は4つの異なることを言った。あなたはどちらをやったのですか? – jgauffin

+0

クエリ用に最適化されています。コードを更新しました。何か問題があれば、私を修正してください。あなたの最初のボードについては、私は実装をあまり理解していません。もちろん申し訳ありません。私はロシア人です。そして私は英語ですばやく思いついたことはありません... – JinDeveloper

0

通常、スピードアップコードは、最初にいわゆる "Profiler"を使用します。これは、実際にコードのコードを実行するツールです(ソースコードラインレベルまで)。

最適化を行う前に、これは常に最初の手順です。私自身の経験から、純粋な推測が遅いのは通常間違っていることがわかりました。その代わりに、プロファイリングは私に最適なボトルネックを見つけるのを助けました。

最初にプロファイラを使用することをお勧めします。個人的には遅いコード行を検出するためにANTS Performance Profiler(14日間の無料試用版)を使用しています。

+1

あなたの返信ありがとうございます。私はプロファイラを試してみる。しかしそれがなければ、問題はデータベース内の情報を更新することだと言えます。データベースへの補足がある場合、追加は迅速です。私が残した問題を引き起こすコード。私は約9000行が追加または更新されていることに注意したい。 – JinDeveloper

2

スレッドプールであっても、長い間実行されます。

妄想。メソッドに10秒かかる場合は、スレッドの内外に10秒かかります。スレッドは、関数の速度を魔法のように向上させるわけではありません。

スレッドプールは、Xメソッド呼び出しを並行して実行できるようにするものですが、それ自体は高速化されません。

ここでは、SQLを実行するのに1ミリ秒以上かかることはないので、遅い場合は、オーバーロードされたハードウェアまたはそれほどスマートでない人インデックスが何であるかを知って、SQLステートメントを非常に遅くする?

また、スレッドプールは、あらかじめ設定されていない限り、スレッドが1秒間に1つ増えてゆくことに注意してください。だからあなたがたくさん待っていたら...あなたは死んでいる。

最後に、なぜあなたはタスクプールではなくスレッドプールを使用していますか?それは新しいことではありません....そして、より良いAPIとスレッドに対するより多くの制御を持っています。

最後に、プロファイラを使用して時間の所要時間を調べます。それは難しいことではありません。プロファイラなしのプログラミングは、何も加熱せずに調理しようとするようなものです。プロの料理?プロのツールを使用してください。

+0

私はこの問題を適切な解決策と考えていたので、私はThreadPoolを使用しています。正しい判断を教えてください。私はあなたに私の問題を解決するための助けに感謝します。 – JinDeveloper

+0

タスク・ライブラリー。または少なくとも、スレッドプールに、通常よりも高い数の開始スレッドを使用するように指示します。さらに、少なくともボーダーラインのプロフェッショナルを得て、仕事をするプロファイターを入れてください。 – TomTom

関連する問題