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
RESULTS
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)
代码被读取的次数多于被写入的次数, and first and last不需要花太多精力就能理解,特别是对于经验不足的 Ruby 程序员或来自具有不同索引语义的语言的人来说。
虽然大多数程序员会立即知道它们是相同的:
a.first
a[0]
第一个仍然更容易阅读。阅读难度没有明显差异,但确实存在。
last是另一个问题。访问索引 0 将获得几乎任何语言的数组的第一个元素。但负索引仅在某些语言中可用。如果一个具有最少 Ruby 经验的 C 程序员尝试阅读我的代码,他们会更快地理解哪个代码?: