async {} рабочий процесс прост в использовании и дает хорошие результаты при асинхронных операциях, таких как IO.Является ли это хорошим вариантом также для операций с чисто данными?
Нет.Async для параллельного ввода-вывода, который полностью отличается от вашей проблемы, которая заключается в параллельных вычислениях с привязкой к процессору.
Есть также .NET ThreadPool и BackgroundWorker, эти лучшие варианты для вычислений с привязкой данных?
Чуть лучше, но они все еще не созданы для этого.
list<(string * list)
Это недопустимый тип.
Моей первоначальной мыслью было использование рабочего процесса ansyc {},
Плохая идея.
, но я не уверен, что эта проблема больше подойдет длядругие параллельные методы, или даже если они должны быть парализованы.
Сначала напишите правильную серийную версию и, если она слишком медленная, оптимизируйте ее и, возможно, распараллелите.Например, вы вряд ли увидите значительные выгоды от параллелизма, когда вы все еще используете связанные списки.
Описанный вами алгоритм может быть реализован следующим образом в F #:
let rec f p a = function
| [] -> List.rev a
| x::xs -> f p ((x, List.filter (p x) xs)::a) xs
где p
- это произвольная предикатная функция, над которой работает ваш алгоритм.Например, следующее находит все последующие строки, равные каждой строке заголовка:
> f (=) [] ["a"; "b"; "c"; "a"; "c"];;
val it : (string * string list) list =
[("a", ["a"]); ("b", []); ("c", ["c"]); ("a", []); ("c", [])]
Выполнение этого на 10000 строк на моем нетбуке занимает менее 6 секунд.Это достаточно быстро?