1

Plinq (Parallel linq ) を使用してオブジェクト コレクションを試したときに基本的な質問がありましたが、Plinq と通常の操作では実行時間に大きな違いがないことがわかりました。誰でも私のコードをチェックして、なぜそうなったのかアドバイスしてもらえますか。このコードを i7 プロセッサで実行しました。

class Program
{
    static void Main(string[] args)
    {
        new Program().Plinq();
        new Program().linq();
        Console.ReadLine();
    }

    void Plinq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.AsParallel().Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Paralel mode", ts.Seconds + ":" + ts.Milliseconds);

    }

    void linq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Normal mode", ts.Seconds + ":" + ts.Milliseconds);

    }

}
class port
{
    public int PortId { get; set; }
    public string CFAC { get; set; }
}

上記のコードの結果は

経過時間: 6:411 秒: パラレル モードでのミリ秒


経過時間: 6:68 秒: 通常モードのミリ秒

4

1 に答える 1

1
  • Where() は IEnumerable を返し、クエリが評価されることはありません。回答を明示的に評価する必要があります (ToList() を使用するなど)。

  • 考慮しなければならないスレッドの起動にはいくらかのオーバーヘッドがあるため、ワークロードの実行には、違いを観察できる十分な時間が必要です。条件の評価にコストがかからない限り、メモリに収まるリストではフィルタリングが十分でない場合があります。

  • 測定には System.Diagnostics.Stopwatch クラスを使用します。それははるかに優れた精度を持っています。

于 2012-02-02T17:17:19.437 に答える