Đã làm một số điểm chuẩn nhanh, bẩn trên một số câu trả lời đã cho. (Những phát hiện này có thể không hoàn toàn giống với của bạn dựa trên phiên bản Ruby, bộ nhớ đệm lạ, v.v. nhưng kết quả chung sẽ tương tự.)
arr
là một tập hợp các đối tượng ActiveRecord.
Benchmark.measure {
100000.times {
Hash[arr.map{ |a| [a.id, a] }]
}
}
Điểm chuẩn @ real = 0,860651, @ cstime = 0,0, @ cutime = 0,0, @ stime = 0,0, @ utime = 0,8500000000000005, @ tổng = 0,8500000000000005
Benchmark.measure {
100000.times {
h = Hash[arr.collect { |v| [v.id, v] }]
}
}
Điểm chuẩn @ real = 0,74612, @ cstime = 0,0, @ cutime = 0,0, @ stime = 0,010000000000000009, @ utime = 0,740000000000002, @ tổng = 0,750000000000002
Benchmark.measure {
100000.times {
hash = {}
arr.each { |a| hash[a.id] = a }
}
}
Điểm chuẩn @ real = 0,627355, @ cstime = 0,0, @ cutime = 0,0, @ stime = 0,010000000000000009, @ utime = 0,6199999999999974, @ tổng = 0,6299999999999975
Benchmark.measure {
100000.times {
arr.each_with_object({}) { |v, h| h[v.id] = v }
}
}
Điểm chuẩn @ real = 1.650568, @ cstime = 0.0, @ cutime = 0.0, @ stime = 0.12999999999999998, @ utime = 1.51, @ total = 1.64
Tóm lại là
Chỉ vì Ruby là biểu cảm và năng động, không có nghĩa là bạn nên luôn tìm kiếm giải pháp tốt nhất. Mỗi vòng lặp cơ bản là nhanh nhất trong việc tạo một băm.
... { |v| [v, f(v)] }
, nhưng điều này đã làm một mẹo nhỏ!