Что означает "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# операция:

  1. на каждом сравнении или логической операции?
  2. на каждом объекте Array создания или блокировки блока?

Было бы неплохо получить глубокий ответ.

0 ответов

Другие вопросы по тегам