ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

Kinesis Firehose のデータ変換 Lambda を Golang で作って計測してみた

概要

前回 やるといってたやつです。
AWS Lambda が Golang を公式サポートしたので、これまでやってきたのと同じような Lambda を作って計測してみました。

先に結果だけ書くと、

  • Rust: 55.8 k レコードを 23.4 秒で処理
    => 1 秒あたり約 2384.6 レコードを処理
  • Python: 56.7 k レコードを 397 秒で処理
    => 1 秒あたり約 142.8 レコードを処理
  • Golang: 52.4k レコードを 13.4 秒で処理
    => 1 秒あたり約 3910.4 レコードを処理

表にするとこんな感じ。

Runtime record/s
Python 142.8
Rust 2348.6
Golang 3910.0

すごい。

仮説

当初立てていた仮説では、Rust とそんなに差はでないかな、と考えていました。
というのも、風の噂でGolang の正規表現は遅い場合があると聞いていたので、ネイティブで動くにしてもそのあたりで差が詰まってトントンという見込みでした。

実装

github.com

実装が上です。これまで同様、 Apache のログを JSON に変換する Lambda です。
AWS CodeStar で作った Web サービス用のものをゴリゴリ書き換えました。

Golang は初めて書きましたが、あんまり違和感なくいけました。
C 書いてましたし、error まわりも Rust の Result と似たような意図を感じたので、そのまま書きました。
ただ、ただ日付には戸惑いました… わかるか!!
そんな僕を助けてくれた記事です。3年以上前…

Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? - Qiita

測定(おさらい)

Lambda の環境

  • Runtime: Go 1.x
  • メモリ: 128 MB
  • 実行時間上限: 5分

Runtime は Go、残り2つは前回と同様です。

指標

  • ExecuteProcessing.Duration: 変換 Lambda の実行時間
  • SucceedProcessing.Records: 変換 Lambda が正常に変換できたレコード数

こちらも前回同様です。
正常に変換できたレコード数を、どれだけの実行時間でさばいたかで測ります。

結果

f:id:rohki:20180218191207p:plain

52.4k レコードを 13.4 秒で処理してます。
ので結果として、1 秒あたり約 3910.4 レコードを処理 した、ってことがわかりました。めっちゃ速いな!

予備計測

上の実装では json-iterator という速い package を使っていたためだきっとそうだ、ということで、JSON へのエンコードを標準の encoding/json でも行いました。
その結果がこちら。

f:id:rohki:20180218192010p:plain

56.2k レコードを 15.8 秒で処理してます。
1 秒あたり約 3557.0 レコードを処理 てことでやっぱり速い!

まとめ

仮説は外れ、Golang は速かったです。
くやしい… Rust の正式対応こい!