規約についての質問です。以下の 2 つのコマンド セットは、同じ結果を返します。
a = [1, 2, 3]
a.first # => 1
a[0] # => 1
a.last # => 3
a[-1] # => 3
Ruby では、明示的なインデックスと関数のどちらが優先されますか? もちろん、これが常に最初または最後の要素にアクセスするコードであると仮定します。
注:それぞれにかかるサイクルについて考えてきました。first
パラメータを受け入れるため、last
オーバーヘッドが少し増えますが、それがコミュニティの好みに影響するかどうかはわかりません。
ありがとう!
編集
この投稿のコメントを読んだ場合、私の最後の段落について大きな議論がありました. [x]
が と同等であることを思い出せませんでしたが.[](x)
、first と last にはもう少しオーバーヘッドがあるという私の結論は正しかったです。両方の性質を考えると、これはfirst
/の引数チェックによるものだと思いますlast
。これらは、引数があるかどうかを確認する必要がありますが、引数が[]
存在すると想定できます。
コード
require 'benchmark'
a = [1..1000]
MAX = 1000000
Benchmark.bm(15) do |b|
b.report("small first") { MAX.times do; a.first; end }
b.report("small [0]") { MAX.times do; a[0]; end }
b.report("small last") { MAX.times do; a.last; end }
b.report("small [-1]") { MAX.times do; a[-1]; end }
end
a = [1..100000000000]
Benchmark.bm(15) do |b|
b.report("large first") { MAX.times do; a.first; end }
b.report("large [0]") { MAX.times do; a[0]; end }
b.report("large last") { MAX.times do; a.last; end }
b.report("large [-1]") { MAX.times do; a[-1]; end }
end
結果
user system total real
small first 0.350000 0.000000 0.350000 ( 0.901497)
small [0] 0.330000 0.010000 0.340000 ( 0.857786)
small last 0.370000 0.000000 0.370000 ( 1.054216)
small [-1] 0.370000 0.000000 0.370000 ( 1.137655)
user system total real
large first 0.340000 0.010000 0.350000 ( 0.897581)
large [0] 0.320000 0.010000 0.330000 ( 0.889725)
large last 0.350000 0.000000 0.350000 ( 1.071135)
large [-1] 0.380000 0.000000 0.380000 ( 1.119587)