2

私はかなり大きな方法を持っています。ここで、C# の計算があり、3/4 ストアド プロシージャを呼び出しています。3/4 オブジェクトを構築し、最後にリストに追加してリストを返します。

私の目標は、このメソッドのパフォーマンスを改善して、実行にかかる時間を短縮することです。

私の質問は、メソッドの各部分をチェックして、実行に時間がかかっている部分を見つける方法はありますか?? ルーギングか何かかもしれません!!

LINQ to EF を使用しています。

4

6 に答える 6

3

Redgate の Antsなどのパフォーマンス プロファイラーに投資します。Visual Studio のより優れたバージョンの一部には、1 つも付属しています。

少なくとも、System.Diagnostics.Stopwatchを使用してみてください。

msdn から:

static void Main(string[] args)
{
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    Thread.Sleep(10000);
    stopWatch.Stop();
    TimeSpan ts = stopWatch.Elapsed;

    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);

    Console.WriteLine("RunTime " + elapsedTime);
}
于 2012-07-18T20:08:35.427 に答える
3

可能であれば、ストアド プロシージャを並行して実行してみてください。特にストアドプロシージャが読み取りのみを行い、書き込みを行わない場合、これによりパフォーマンスが大幅に向上することがわかりました。

次のようになります。

ConcurrentBag<Result> results = new ConcurrentBag<Result>();

Parallel.Invoke(
                () => {
                    var db = new DatabaseEntities();  
                    Result result1 = db.StoredProcudure1();
                    results.Add(result1);
                }
                () => {
                    var db = new DatabaseEntities();  
                    Result result2 = db.StoredProcudure2();
                    results.Add(result2);
                }
                () => {
                    var db = new DatabaseEntities();  
                    Result result3 = db.StoredProcudure3();
                    results.Add(result3);
                }
);

return results;

スレッドセーフであるためConcurrentBag、 a の代わりにa here を使用しています。List

于 2012-07-18T20:19:53.880 に答える
1

いくつかのオプションがあります。この種のことをテストするためにストップウォッチを使用していることに気づきました。ただし、何かを行う前に、コードがまだ十分に機能していないことを確認してください。壊れていない場合は、修正しないでください。これが多くの場合、最善のアドバイスです。それでも興味がある場合は、次のようなことができます。

Stopwatch sw = Stopwatch.StartNew();

// do some code stuff here

sw.Stop();

Console.WriteLine(sw.ElapsedTicks);

sw 変数には、秒、ミリ秒、およびその他の測定値もあります。

于 2012-07-18T20:09:13.533 に答える
1

私のアドバイスは、JetBrains dottraceを使用することです。これには、ホットスポットを示し、どのコード部分にどれだけの時間がかかったかを示す非常に役立つ機能がいくつかあります

PS:それは私の首を数回救った

于 2012-07-18T20:09:36.033 に答える
1

探しているのはプロファイラーです。プロファイラーはプログラムを実行し、コードの各行の実行にかかった時間と、実行にかかった時間を合計実行時間のパーセンテージで示します。

優れた C# プロファイラーはANTS .Net Profilerです。かなり高価ですが、14 日間の無料試用版があります。これはあなたのニーズにぴったりだと思います。

于 2012-07-18T20:08:38.593 に答える
0

データベースへのアクセスは、通常、実行する可能性のある計算よりも桁違いに遅くなります (明日の天気を予測しようとしている場合を除く)。そのため、おそらく LINQ から EF への部分で時間が失われます。

プロファイラーを使用してプログラムを分析できます。SQL-Server には、クエリを監視できるプロファイラーがあります。コードを分析したい場合は、Google で .NET プロファイラーを検索すると、ライセンスが無料のプロファイラーが多数見つかります。または、便利だと思ったら購入してください。EQATECプロファイラーは私にとって非常に役に立ちました。

大きなメソッドがある場合、コードは構造化されていません。大きなメソッドを作成しても、小さな論理部分に分割するよりも速くはなりません。パーツが小さいほど保守が容易になり、コード プロファイラーはより有用な情報を生成します。これは、多くの場合、メソッド呼び出しの合計のみが返され、コードの 1 行の時間が表示されないためです。

于 2012-07-18T20:13:32.337 に答える