В проекте Ruby, который я провел некоторое время в последнее время, я подсчитываю пересечение двух больших наборов строк.Почему сравнение строк так быстро по сравнению с целым сравнением?
Из того, что, как я думал, я понял, я решил, что было бы очень полезно сравнивать целые числа вместо строк (все эти строки хранятся в базе данных, и я мог бы просто просто заменить их на идентификаторы)
Когда я на самом деле сделал бенчмаркинг, я закончил поиск полной противоположности.
Сначала я генерироваться наборы 850 строк, и наборы ~ 850 больших целых чисел:
r = Random.new
w1 = (1..850).collect{|i| w="";(0..3).collect{|j| (rand*26 + 10).to_i.to_s(35)}.each{|l| w+=(l.to_s)};w}.to_set
w2 = (1..850).collect{|i| w="";(0..3).collect{|j| (rand*26 + 10).to_i.to_s(35)}.each{|l| w+=(l.to_s)};w}.to_set
i1 = (1..2000).collect{|i| (r.rand*1000).to_i**2}.to_set;
i2 = (1..2000).collect{|i| (r.rand*1000).to_i**2}.to_set;
И тогда я приуроченная сравнений:
t=Time.now;(0..1000).each {|i| w1 & w2};Time.now-t
=> 0.301727
t=Time.now;(0..1000).each {|i| i1 & i2};Time.now-t
=> 0.70151
Что я думал, что сошел с ума! Я всегда считал, что целочисленное сравнение было намного быстрее.
Так что мне было интересно, знал ли кто-нибудь в мире стеков что-то о том, почему сравнение строк в рубине намного быстрее, я бы очень хотел услышать ваши мысли.
Отличный ответ. Хорошо написанный и описательный. Спасибо за помощь. :] – BananaNeil