Что означает "nil#" в результатах профилировщика?
Вот очень упрощенная часть кода:
srand 0
WIDTH, HEIGHT = 10, 10
array = Array.new(HEIGHT){ [0]*WIDTH }
require "profile"
10000.times do
y, x = rand(HEIGHT), rand(WIDTH)
g = array[y][x] + [-1,+1].sample
array[y][x] = g unless [[y-1,x],[y+1,x],[y,x-1],[y,x+1]].any?{ |y, x|
y>=0 && y<HEIGHT && x>=0 && x<WIDTH && 1 < (array[y][x] - g).abs
}
end
Мы видим (ruby 2.0.0p451 (2014-02-24) [i386-mingw32]
):
% cumulative self self total
time seconds seconds calls ms/call ms/call name
39.33 0.86 0.86 47471 0.02 0.05 nil#
Если мы полностью удалим unless
вещь:
53.48 0.48 0.48 10000 0.05 0.09 nil#
Похоже, мы получили это nil#
операция:
- на каждом сравнении или логической операции?
- на каждом объекте Array создания или блокировки блока?
Было бы неплохо получить глубокий ответ.