[Golang]アルゴリズムにチャレンジ ~検索エンジンを実装しよう!~

こんにちは。KOUKIです。

とあるWeb系企業で、Goエンジニアとして色々なAPIを実装しています。

今回は、Golangによるデータ検索のアルゴリズムについて記事にしました。

モジュール

fakerを使って、テストデータを作成します。

検索エンジンの実装

EmailとNameを保持したUser構造体からEmailを検索して、Nameを返却するプログラムを実装しましょう。

逐次処理で実装

最初は逐次処理でユーザーを検索するアルゴリズムを実装します。

Inif関数ではfakerを使ってテストデータを3000000件追加しており、WorkerのFineメソッドにEmailを渡すことでデータ検索をできるようにしています。

また、プログラム実行時に引数としてEmailを渡せるように、osパッケージのArgsメソッドを使用しています。

Channelバージョン

次に、Channelバージョンを実装します。

Channelの場合は、goroutineでFindメソッドを実行します。

Selectでは、caseを使ってチャネルからデータを取得しています。便利なのが、上記のコードの様にtimeoutを設定できることです。15秒以上経ってもデータが検索できない場合はtimeoutにしました。

逐次処理と比較しても実行速度はあまり変わりませんね。

Goroutineを複数にしてみる

Goroutineを複数にして処理を実行してみましょう。

おお、3ms早くなりましたね!

Nameを与える

GoroutineにNameを与えてみましょう。

#3のgoroutineでデータを取得したことがわかりますね。goroutineを一つ増やしたので、データ取得も1ms早くなりました。

おわりに

実際の現場でもデータ検索を実装する機会はたくさんあります。

その時、速度を意識してアルゴリズムを実装してみるのもいいかもしれません

例えば、stringsパッケージのContainsメソッドを使って検索処理を実装してみましょう。

意外なことに7倍くらい処理が遅くなってしまいました!

処理を実装するときは、色々なパターンで実装し、testingパッケージのBenchmarkで速度計測した方が良さそうですね。

それでは、また!

Go記事まとめ

アルゴリズムまとめ

Go記事をまとめます。

コメントを残す