Ruby でベンチマークを取る方法
何の記事??
早速ですが、みなさんは APIレスポンスが遅かったりバッチ処理が長くて「〇〇さんの担当している部分が遅いんじゃないの?」と疑われたことはありますか??
僕はあります泣(p>□<q*)
というのもデータ処理部分をメインでやっているためどうしても単純なファイル連携のバッチなんかをイメージして同じ「バッチ」と括られてしまうとやはり処理時間の長いバッチになってしまうことがあるんです
・・・という言い訳はこの辺にして、本題に入りましょう。
そんな時に「僕のかいたコード部分はこのくらいの時間がかかっています。」「こんな手法を試してしっかりと測定した結果この方法を取っています」などと的確にレスポンスするためにも必要なことが・・・
ベンチマークを取ること!!
今回はこのベンチマークというものを知ってもらうために Ruby でベンチマークをとる方法を紹介します!!
ベンチマークとは
プログラムは何かしら目的はあった上で書くものですが、大抵の場合に手法やロジックが複数候補に上がり頭の中ないしはチームと相談してアルゴリズムを決定することが大半だと思います。
しかし、その方法本当に最適ですか??
「実装が楽だから」(たしかに魅力的!!笑)とかあの先輩が言ったからといった理由で決めていませんか??
しっかりと測定しましょうして決めるべきですよね。
じゃあどうやって測定するのか・・・そんな時にベンチマークの出番です!!
それでは具体的にどんなことを測定・比較するかと言うとそれは web、研究・開発・IoT などでだいぶ変わってくるのですが、僕は基本的な以下をいつも測っています。
- 処理完了までにかかる時間
- メモリ消費量
Ruby でベンチマークをとる
Ruby ではベンチマーク用の標準ライブラリ(Benchmark)が用意されています。
「文字列の連結」を例にベンチマークのコードを見ていきましょう!
今回比較するのは += で文字列を繋げる方法と << で連結する方法です。
一般的には、<< の方が早いと言われていますが実際にどうなるでしょうか。計測していきましょう!!
ベンチマークの際に GC というメモリに残ってしまったゴミを掃除する機能を明示的に止めておく必要があります。(3行目)
実際にベンチマークを出している箇所は、コメント「1個目のベンチーク」と「2個目のベンチマーク」と書かれている箇所です。
report メソッドの引数には、レポートで表示する名前を入れてあげます。今回は += と << ですね。計測したい処理をブロックの中に書いてあげます。
今回はどちらも10000回、+= もしくは << で文字列を連結している箇所ですね!
require 'benchmark' # GC を止める GC.disable Benchmark.bm() do |x| # 1個目のベンチマーク x.report("+=") { str = "" 10000.times do str += "hoge" end } # 2個目のベンチマーク x.report("<<") { str = "" 1000.times do str << "hoge" end } end
実行結果は!!
user system total real += 0.049862 0.046535 0.096397 ( 0.096497) << 0.000112 0.000014 0.000126 ( 0.000126)
システム時間やら、ユーザータイムやらあるのですが一旦見て欲しいのは、real の箇所です。
なんと += メソッドを使った方は、0.096497秒かかっているのに対して、<< メソッドで連結している方は 0.000126秒で完了していますね!!
これで自信を持って、<< の方が早いのでこちらを使いましたと言えるわけです!!
最後に
今回は比較的にすでに知られている Ruby のメソッドの早いものと遅い物を比べたのでネットで調べればどちらが早いかはすぐに出ますが、これが本当に独自処理とか噛ませていくとわけわからなくなるんですよ笑
なのでベンチマークをしっかりとってあげて安心して処理を決定してあげる必要があるんですね!!
Twitter もお願いします!!(フォローの際に「ブログから」といただけると嬉しいです。読者と絡みたい!!笑)
また、最近プログラミングメンターを始めました。お気軽にご相談ください。
少しでも興味を持っていただけたら嬉しいです。
それではまた次回〜