مسیرها
/
Lean
Lean
/
تمرین‌ها
/
فراوانی موازی حروف
فراوانی موازی حروف

فراوانی موازی حروف

متوسط

دستورالعمل‌ها

فراوانی حروف را در متن‌ها با استفاده از محاسبات موازی بشمارید.

موازی‌سازی یعنی کارهایی را به‌صورت موازی انجام دهیم که می‌توان آن‌ها را به‌صورت متوالی هم انجام داد. یک مثال رایج، شمردن فراوانی حروف است.

برای محاسبه‌ی فراوانی کل هر حرف در فهرستی از متن‌ها، از موازی‌سازی استفاده کنید.

وظیفه‌های ناهمگام

وظیفه‌ها اصلی‌ترین انتزاع برای نوشتن کد ناهمگام در Lean هستند. سبک‌وزن‌اند و ممکن است به‌صورت موازی روی رشته‌ای دیگر، یا هم‌روند روی همان رشته اجرا شوند.

وظیفه‌ها می‌توانند خالص یا ناخالص باشند. وظیفه‌های خالص با Task.spawn ساخته می‌شوند که یک محاسبه‌ی خالص را می‌پذیرد. وظیفه‌های ناخالص از محاسبه‌های IO ساخته می‌شوند، برای نمونه با IO.asTask، که یک IO α را درون موناد IO به یک Task α بالا می‌برد.

در این تمرین، تابع 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 در پیش می‌گیرند نگاه می‌کنیم.