Array#sampleとEnumerable#min_by|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。Array#sampleとEnumerable#min_byhachi8833シェアツイートブックマークLINE最近ちょくちょくfast-rubyを眺めています。idioms.Rubyが速くなる書き方はいろいろありますが、常日頃kazzさんから「ビジネスロジックはしょっぱなから最適化するもんじゃないよ⚠️」「最初は素直に、可読性とプロジェクトの方針重視で書こう」「最適化は速度が問題になってからにすべき」とよく言われます。調べている途中ですが、fast-rubyで速いとされている書き方の多くは、rubocop様のお告げと必ずしも一致しなかったり、速い方と遅い方のどちらも何も言われなかったりします。速い書き方に飛びついて業務コードの可読性を落とすのは避けたい。そこで、fast-rubyの中から、rubocop様のデフォルト設定のお眼鏡にかない、かつ十分高速な、安心して使える書き方をピックアップしてみました。やってみると意外に少ないですね。2.7.2以下を実行する前にrubocopとrubocop-performanceとbenchmark-ipsをインストールしておきます。koicの日記fast-rubyとの違いについてfast-rubyに載っているベンチマークコードのままだとrubocopにビシビシ怒られるので修正してあります。}.freezeに置き換えました。slowerArray#sampleが20倍以上高速です。[*1..100]でも差は変わりませんでした。arrayのサイズを100から1000に増やすと180倍近く差が付きました。Enumerable#min_by最大要素ならmax_byですね。minmax_byというのもあります。2.6.0)コードこちらも余分なエラーが出ないようにしてあります。以下はmin_byですが、max_byとsort_by+lastも同様の結果でした。slowerEnumerable#min_byが3倍以上高速です。[*1..100]でも2倍の差が付きました。サイズを100から1000に増やすと4倍以上差が付きました。Enumerable#min_byのような極端な差ではなく、対数感覚で差が開いていますね。slower考えてみればどちらも遅い方はソートしている分、遅いのは当然ですね?。以上は素のRubyの場合です。RecordオブジェクトのようにDB永続化が絡む場合は#orderなどでソート済みにします。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。