やわらかテック読者になるやわらかテック興味のあること。業務を通して得られた発見。inが遅いのかRuby先日、以下の記事を公開しました。inが最も遅く、each関数が最も速いという結果になりました。一体、なぜこのような結果になるのか。Rubyの深い部分まで把握する必要がありそうだと判断し、前回の記事では調査を行わなかったのですが、今回はその謎に迫ってみたいと思います。そもそもRubyにはfor文がないこの記事を書く前までRubyには他言語と同様にfor文が定義されているものだと思っていましたが、それが勘違いであることに気づきました。Rubyでは繰り返し処理を記述したい場合、whileやeach関数を使うのが一般的です。JavaScriptでは10回、文字列を出力する際に以下のように書きます。console.log('hello!');}よくある一般的なfor文かなと思います。それに対して、Rubyでは一例として以下のように書きます。inはJavaScriptで実装されているfor文とは似て非なるものです。一体、何が違うのでしょうか。inは糖衣構文であり、内部でeach関数に近しい処理を実行しているそうです。先ほどはRubyの組み込みのループプリミティブはwhileとuntilだけだと言いました。この「for」というものは何でしょうか。実際には、forはほぼ糖衣構文といえるものです。inを呼び出すと内部ではeach関数に近しい処理に変換されているということが分かりました。inがeach関数よりも遅いという説明がつきますね。Rubyにはfor文は実装されていないということになります。ループのプリミティブな定義はwhileとuntilだけとありましたが、each関数はどうなのでしょうか。内部でwhileを呼び出していたりするのでしょうか。array.cを見てみるいよいよ最深部へ...。RubyのC言語実装のコードへやってきました。each関数が実装されているのはarray.cというファイルだそうです。ary;}まずeach関数の実装がC言語のファイルにあるということで、each関数が内部でRubyのwhileもしくはuntilを呼び出していないことが分かりました。each関数のパフォーマンスが良いのは内部でC言語のコードを呼び出して実行しているからというのが理由の一つなのでしょうね。この実装の詳細については分かりかねますが、明らかなのはC言語のfor文を使って、配列の処理を行なっているという点です。inは糖衣構文であり、内部でeach関数に近しい処理を行なっているeach関数はC言語で実装されており、内部ではC言語のfor文が記述されている少しでも「ええな〜」と思ったらイイネ!・シェア!・はてなブックマークを頂けると励みになります。10:31Tweet関連記事2023-05-18【Ruby】配列からハッシュを生成する4つの方法と速度比較Rubyで開発をしていると配列からハッシュ(連想配列)を生成する...2023-03-06Rubyで巨大な配列を扱う時はEnumeratorを使うのが良さそう先日、Rubyで巨大な配列(Array)を扱うことがありました。気に...2023-02-28【Ruby】boolean型の値を渡すだけの関数にはキーワード引数を付与してあげようある日のこと。22:23名古屋発のベンチャーでWEBアプリのバックエンドをメインに作っています。エンジニア育成やチームビルディングにもちょっとだけ携わっています。3はてなブログをはじめよう!takamizawa46さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。