Треки
/
Lean
Lean
/
Вправи
/
Паралельний підрахунок частоти літер
Паралельний підрахунок частоти літер

Паралельний підрахунок частоти літер

Середня

Вказівки

Порахуйте частоту літер у текстах за допомогою паралельних обчислень.

Паралелізм полягає в тому, щоб виконувати паралельно те, що також можна виконати послідовно. Поширений приклад - підрахунок частоти літер. Застосуйте паралелізм, щоб обчислити загальну частоту кожної літери в масиві текстів.

Асинхронні задачі

Основною абстракцією для написання асинхронного коду в Lean виступають задачі. Вони легковагі й можуть виконуватися паралельно в іншому потоці або одночасно в тому самому потоці.

Задачі бувають чистими або нечистими. Чисті задачі створюють за допомогою Task.spawn, який приймає чисте обчислення. Нечисті задачі створюють з обчислень IO, використовуючи, наприклад, IO.asTask, який піднімає IO α до Task α у монаді IO.

У цій вправі функція calculateFrequencies монадична й повертає IO (Std.TreeMap Char Nat). Це дозволяє використовувати нечисті задачі через IO.asTask, а також дає змогу породжувати чисті задачі для проміжних обчислень перед поверненням остаточного значення.

Запобігання перегонам даних

Оскільки Lean належить до функціональних мов, більшість значень у ньому персистентні, тобто незмінні. Операції, які нібито змінюють значення, насправді створюють нове значення із запитаними змінами. Це означає, що памʼять часто можна безпечно спільно використовувати між задачами, не спричиняючи перегонів даних.

Однак зауважмо, що не всі структури даних однаково добре придатні до персистентного використання. Наприклад, щоб оновити один елемент Array, зазвичай потрібно скопіювати весь масив. Те саме стосується Std.HashSet і Std.HashMap.

Щоб зробити такі структури даних ефективними, Lean використовує підрахунок посилань. Доки значення має єдине посилання, оновлення можна виконувати деструктивно, уникаючи зайвого копіювання.

Інші структури даних, як-от List, Std.TreeSet і Std.TreeMap, створені так, щоб спільно використовувати структуру всередині. Вони повторно використовують незмінені вузли під час оновлень, тож кілька значень можуть спільно посилатися на ці вузли. Унаслідок цього зміна однієї частини структури зазвичай не потребує копіювання всього значення. Завдяки цьому вони особливо добре підходять для спільного використання між задачами.

Вимірювання швидкості виконання

Час виконання кожного тесту вимірюють у наносекундах за допомогою IO.monoNanosNow і показують поряд з результатами. Можна експериментувати з різними підходами і перевіряти їхній вплив на швидкість виконання.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Lean Exercism

Час розпочати Паралельний підрахунок частоти літер?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Lean, а також 100 вправ та справжнє наставництво від людей, і все це безкоштовно.

Глибоке занурення у Паралельний підрахунок частоти літер!

Ми дослідимо різницю між конкурентністю і паралелізмом, розглянувши різні підходи, які застосовують такі мови, як JavaScript, Go, Elixir і Rust.