gpt4 book ai didi

ruby - 为什么 map {}.compact 比 each_with_object([]) 更快?

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:33 25 4
gpt4 key购买 nike

我做了一些基准测试:

require 'benchmark'

words = File.open('/usr/share/dict/words', 'r') do |file|
file.each_line.take(1_000_000).map(&:chomp)
end

Benchmark.bmbm(20) do |x|
GC.start
x.report(:map) do
words.map do |word|
word.size if word.size > 5
end.compact
end

GC.start
x.report(:each_with_object) do
words.each_with_object([]) do |word, long_sizes|
long_sizes << word.size if word.size > 5
end
end
end

输出( ruby 2.3.0):

Rehearsal --------------------------------------------------------
map 0.020000 0.000000 0.020000 ( 0.016906)
each_with_object 0.020000 0.000000 0.020000 ( 0.024695)
----------------------------------------------- total: 0.040000sec

user system total real
map 0.010000 0.000000 0.010000 ( 0.015004)
each_with_object 0.020000 0.000000 0.020000 ( 0.024183)

我无法理解它,因为我认为 each_with_object 应该更快:它只需要 1 个循环和 1 个新对象来创建一个新数组,而不是 2 个循环和 2 个新对象,以防我们合并mapcompact。有什么想法吗?

最佳答案

Array#<<如果原始内存空间没有足够的空间来容纳新项目,则需要重新分配内存。参见 the implementation ,尤其是这一行

VALUE target_ary = ary_ensure_room_for_push(ary, 1);

同时 Array#map不必不时重新分配内存,因为它已经知道结果数组的大小。参见 the implementation , 特别是

collect = rb_ary_new2(RARRAY_LEN(ary));

它分配了与原始数组相同大小的内存。

关于ruby - 为什么 map {}.compact 比 each_with_object([]) 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com