0

2 つの異なる方法でほぼ同じ時間がかかる理由がわかりません。または、タスクを間違った方法で使用していますか?ここに私のコードがあります。

static void Main(string[] args)
{
    var result = new List<string>();
    var list = new List<string>();
    list.Add(string.Empty);
    list.Add(string.Empty);
    list.Add(string.Empty);
    //1st,use select
    result.AddRange(list.Select(ls=>Nothing1000000000));
    //2nd,use tasks
    result.Clear();         
    IEnumerable<Task<string>> tasks =
        list.Select(uri =>                Task<string>.Factory.StartNew(()=>Nothing1000000000));
    result.AddRange(tasks.Select(task => task.Result));
}
public static string Nothing1000000000()
{
    int result = 0;
    for (var i = 0; i < 1000000000; i++)
    {
        result += i;
    }

    return string.Empty;
}
4

3 に答える 3

0

単一の作業単位を実行しています-メソッド Nothing1000... その作業単位をアプリのメインスレッドから別のスレッドに移動しても、作業単位の実行にかかる時間は魔法のように変わりません。
これをメイン アプリ スレッドから移動する理由の 1 つは、作業単位の実行中にそのアプリ スレッドを解放して他のことを行うためです。これにより、ユーザー エクスペリエンスが向上する可能性がありますが、作業単位の実行時間は変わりません。
おそらく、あなたが求めているのは、作業単位を N 個の個別の作業単位に分割することです。N個のプロセッサまたはプロセッサコアがある場合、N個のユニットは単一のスレッドで全体よりも高速に実行されます.1つのタスクは、N個のプロセッサ/コアのそれぞれで1/Nの作業を行います。ただし、TPL 内でそのような一般的なシナリオを処理するためのより良い方法があります。

于 2013-10-24T11:07:38.227 に答える
0

タスクとは何か、何をするのかについて完全に間違った考えを持っているようです。これらは計算を高速化するために使用されるわけではないため、パフォーマンスに違いが見られないのも不思議ではありません。

于 2013-10-22T11:33:18.990 に答える