Вопрос
В запросе LINQ я могу правильно (например: компилятор не будет жаловаться) вызов .AsParallel(), как это:Куда звонить .AsParallel() в запросе LINQ
(from l in list.AsParallel() where <some_clause> select l).ToList();
или как это:
(from l in list where <some_clause> select l).AsParallel().ToList();
что именно разница?
То, что я пытался
Судя по official documentation я почти всегда видел первый метод, используемый таким образом, я думал, что был путь.
Сегодня, я попытался запустить некоторый тест самостоятельно, и результат был неожиданным. Вот код, я бежать:
var list = new List<int>();
var rand = new Random();
for (int i = 0; i < 100000; i++)
list.Add(rand.Next());
var treshold= 1497234;
var sw = new Stopwatch();
sw.Restart();
var result = (from l in list.AsParallel() where l > treshold select l).ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() before: {sw.ElapsedMilliseconds}");
sw.Restart();
result = (from l in list where l > treshold select l).AsParallel().ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() after: {sw.ElapsedMilliseconds}");
Выход
вызов .AsParallel() до: 49
.AsParallel вызова() после того, как: 4
Итак, очевидно, несмотря на то, что говорит документация, второй способ намного быстрее. Что здесь происходит?
Ваша машина одноядерная или многоядерная? –
@viveknuna multi-core – Mahatma
Он даст вам разные результаты каждый раз –