Так почему бы мне не использовать асинхронное выполнение параллельных процессов данных?
Если у вас есть крошечное количество полностью независимых не-1005 * задач и много ядер, тогданет ничего плохого в использовании async для достижения параллелизма.Однако, если ваши задачи каким-либо образом зависят от вас, или у вас больше задач, чем у ядер, или вы слишком сильно углубляетесь в код async
, то вы оставите большую производительность на столе и сможете добиться гораздо большего, есливыбирая более подходящую основу для параллельного программирования.
Обратите внимание, что ваш пример можно написать еще более элегантно, используя TPL из F #:
Array.Parallel.map f xs
Что я потеряюпри написании параллельного асинхронного кода вместо использования PLINQ или TPL?
Вы теряете возможность писать код, не обращающий внимания в кэш-памяти, и, следовательно, будете страдать от множества ошибок в кеше и, следовательно, все ядра останавливаются в ожиданииразделяемая память, что означает плохую масштабируемость в многоядерной среде.
TPL основан на идее, что дочерние задачи должны выполняться с тем же ядром, что и их родительские, с высокой вероятностью и, следовательно, выиграют от повторного использования тех же данныхпотому что будет жарко в локальном кеше процессора.С асинхронностью такой уверенности нет.