1

次のようなメソッドがあります。

public void SomeMethodThatLoadsUserData()
{
   Method1();
   Method2();
   Method3();
   .....
   Method12();
}

これらは、ユーザーがログオンし、各メソッドがユーザーに関連するデータをフェッチするときに実行されます。各メソッドが同じデータベース ファイルへのクエリを呼び出すことになるため、これらを並行して実行するとパフォーマンスが向上するかどうか疑問に思っていました。また、パフォーマンス上の利点がある場合、このコードをどのように書き直せばよいでしょうか?

ご提案いただきありがとうございます。

4

2 に答える 2

1

次のコードは、Thread オブジェクトと Stopwatch オブジェクトのリストを使用した並列テストを示しています。これは、(Parallel.Invoke とは異なり) 並列実行の試行を保証し、ThreadPool IMO を使用するよりもセットアップが簡単であるため、テストするのに非常に適した方法だと思います。

public static void SomeMethodThatLoadsUserData()
{
    Stopwatch s = new Stopwatch();
    s.Start();

    List<Thread> threads = new List<Thread> {new Thread(Method1), new Thread(Method2)};

    foreach (Thread thread in threads)
    {
        thread.Start();
    }

    foreach (Thread thread in threads)
    {
        thread.Join();
    }

    s.Stop();
    Console.WriteLine("Total: {0} ms", s.ElapsedMilliseconds);

    Console.ReadKey();
}

private static void Method1()
{
    Stopwatch s = new Stopwatch();
    s.Start();
    // do work
    Thread.Sleep(1000);
    s.Stop();
    Console.WriteLine("Method 1: {0} ms", s.ElapsedMilliseconds);
}

private static void Method2()
{
    Stopwatch s = new Stopwatch();
    s.Start();
    // do work
    Thread.Sleep(1000);
    s.Stop();
    Console.WriteLine("Method 2: {0} ms", s.ElapsedMilliseconds);
}

出力:

Method 1: 999 ms
Method 2: 999 ms
Total: 1051 ms

(うまくいけば)Total各メソッドの合計よりも少ない場合、時間の節約が表示されます。

于 2012-07-22T21:31:15.003 に答える
-2

これが最速なのか最善の方法なのかはわかりませんが、各メソッドを新しいスレッドにスピンオフすることができます。

Thread t = new Thread(() => Method1());
t.Start();
于 2012-07-22T19:48:55.140 に答える