При использовании ruby-prof, что является источником `[global]#[no method]` в выходных данных профилировщика?

Короткая версия: что является источником [global]#[no method] в выходных данных Ruby Profiler ниже, и есть ли способ устранить его или сократить его время? Это занимает более 50% от общего времени выполнения моего метода, и это единственная часть результатов профилировщика, которую я не могу объяснить.

Длинная версия: я использую ruby-prof gem для профилирования кода Ruby ниже. Метод find_median_sorted_arrays принимает два отсортированных массива и возвращает их медиану в виде числа с плавающей точкой (отсюда и название). Проблема возникла на веб-сайте, посвященном проблеме кодирования, и я решил запустить профилировщик для своего решения, потому что, очевидно, 80% представленных решений Ruby работают быстрее, чем мое.

Обратите внимание, что версия Ruby ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]:

def find_median_sorted_arrays(nums1, nums2)
  sorted_array = [nil] * (nums1.length + nums2.length)
  nums1_counter, nums2_counter = 0, 0
  sorted_array.each_with_index do |num, index|
    if nums2_counter >= nums2.length || (nums1[nums1_counter] && nums1[nums1_counter] < nums2[nums2_counter])
      sorted_array[index] = nums1[nums1_counter]
      nums1_counter += 1
    else
      sorted_array[index] = nums2[nums2_counter]
      nums2_counter += 1
    end
  end

  return median(sorted_array)
end

def median(array)
  len = array.length
  (array[(len - 1) / 2] + array[len / 2]) / 2.0
end

nums1 = [1,2]
nums2 = [3,4]

RubyProf.start
find_median_sorted_arrays(nums1, nums2)
result = RubyProf.stop

printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)

Вывод следующий:

 %self      total      self      wait     child     calls  name
 58.56      0.000     0.000     0.000     0.000        1   [global]#[no method]
 11.60      0.000     0.000     0.000     0.000        1   Array#each
 11.60      0.000     0.000     0.000     0.000        1   Object#find_median_sorted_arrays
  6.63      0.000     0.000     0.000     0.000        1   Array#*
  4.42      0.000     0.000     0.000     0.000        1   Fixnum#/
  4.42      0.000     0.000     0.000     0.000        1   Object#median
  2.76      0.000     0.000     0.000     0.000        1   Enumerable#each_with_index

Как я уже упоминал в короткой версии, [global]#[no method] занимает более 50% от общего времени выполнения моего метода, и это единственная часть результатов профилировщика, которую я не могу объяснить. Откуда это взялось, и есть ли способ устранить его или сократить его время?

0 ответов

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