Разница, по-видимому, составляет менее одного порядка, при этом целочисленный подход быстрее на Fixnum
с. Для Bignum
с относительная производительность начинается более или менее равномерно, а строковый подход значительно выигрывает при увеличении числа цифр.
в виде строк
Программа
#!/usr/bin/env ruby
require 'profile'
$n = 1234567890
10000.times do
$n.to_s.split(//).map {|x| x.to_i}
end
выход
% cumulative self self total
time seconds seconds calls ms/call ms/call name
55.64 0.74 0.74 10000 0.07 0.10 Array#map
21.05 1.02 0.28 100000 0.00 0.00 String#to_i
10.53 1.16 0.14 1 140.00 1330.00 Integer#times
7.52 1.26 0.10 10000 0.01 0.01 String#split
5.26 1.33 0.07 10000 0.01 0.01 Fixnum#to_s
0.00 1.33 0.00 1 0.00 1330.00 #toplevel
как целые числа
Программа
#!/usr/bin/env ruby
require 'profile'
$n = 1234567890
10000.times do
array = []
n = $n
until n == 0
m = n%10
array.unshift(m)
n /= 10
end
array
end
выход
% cumulative self self total
time seconds seconds calls ms/call ms/call name
70.64 0.77 0.77 1 770.00 1090.00 Integer#times
29.36 1.09 0.32 100000 0.00 0.00 Array#unshift
0.00 1.09 0.00 1 0.00 1090.00 #toplevel
Добавление
Шаблон, похоже, подходит и для меньших чисел. При $n = 12345
для строкового подхода было около 800 мс, а для целочисленного подхода - 550 мс.
Когда я пересек границу в Bignum
с, скажем, с $n = 12345678901234567890
, я получил 2375 мс для обоих подходов. Казалось бы, разница хорошо выравнивается, и я бы сказал, что внутреннее локальное питание Bignum
имеет форму строки. Тем не менее, документация , похоже, предлагает иное.
В академических целях я еще раз удвоил количество цифр до $n = 1234567890123456789012345678901234567890
. Я получил около 4450 мс для строкового подхода и 9850 мс для целочисленного подхода, резкое изменение которого исключает мой предыдущий постулат.
Краткое описание
Number of digits | String program | Integer program | Difference
---------------------------------------------------------------------------
5 | 800ms | 550ms | Integer wins by 250ms
10 | 1330ms | 1090ms | Integer wins by 240ms
20 | 2375ms | 2375ms | Tie
40 | 4450ms | 9850ms | String wins by 4400ms