並列計算を使って、テキストに含まれる文字の出現頻度を数えましょう。
並列処理とは、順番に実行することもできる物事を、並行して行うことです。よくある例が、文字の出現頻度を数えることです。並列処理を活用して、テキストの配列に含まれる各文字の出現頻度の合計を計算しましょう。
Goはゴルーチンによって並行処理をサポートしています。ゴルーチンはgoキーワードで開始します。
これは、並行処理を支えるシンプルで軽量、かつエレガントな仕組みであり、この言語の最大の強みの一つです。
この演習は並列文字頻度という名前ですが、Goでは「並列」という言葉をそれほど頻繁には見かけないことに気づくかもしれません。 ゴーファーは、複数の独立したゴルーチンを管理することを表すのに、並行という言葉を好みます(これは他の言語でいう「プロセス」や「スレッド」にあたります)。 これらの言葉はしばしば同じ意味で使われますが、ゴーファーは技術的に正確であることを好み、ゴルーチンが見かけ上同時に実行されているように見えるときの話には「並行」を使います。
プログラムを並列で動かすように設計することはできますし、実際に並列で動いているように見えることもありますが、コードの実行コンテキストを厳密に把握していなければ、保証できるのはプロセスが並行して動くということだけです。 言い換えれば、区別できないほど高速に逐次実行されているだけで、厳密に同時に実行されているわけではない、ということです。
さらに詳しく知りたい場合は、Go Blogの記事Concurrency is not parallelismを見てみましょう。
Goの並行処理の機能に初めて触れる方のために、始めるのに役立つリソースをいくつか紹介します。 この演習を始める前に、目を通しておくことをおすすめします。
さらに深く掘り下げたい場合は、@kat-coによる書籍Concurrency in Goを読んでみてください。
この演習では、ユニットテストでよい並行処理の解答を書けたかどうかを判定することはできません。
代わりに、この演習をローカルで解いて、go test -bench .でベンチマークを実行するのがよいでしょう。
よい解答であれば、並行版は逐次版よりも1操作あたりのナノ秒数(ns/op)が少なくなっているはずです。