2015-12-08 15 views
7

Znalazłem, gdy nowe Hash, który ma siedem obiektów, jest znacznie wolniejsze niż sześć długości skrótu. Wiem, że długość skrótu wpłynie na wydajność. Ale nie wiem, dlaczego siódemka jest wyjątkowa.dlaczego nowy hash, który ma siedem obiektów, jest znacznie wolniejszy niż skrót o długości sześciu?

Oto kod odniesienia (Ruby 2.2.3):

require 'benchmark/ips' 

Benchmark.ips do |x| 
    x.report(5) { { a: 0, b: 1, c: 2, d: 3, e: 4 } } 
    x.report(6) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5 } } 
    x.report(7) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6 } } 
    x.report(8) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7 } } 
    x.report(9) { { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8 } } 

    x.compare! 
end 

A cios to wyniki:

Calculating ------------------------------------- 
        5 65.986k i/100ms 
        6 63.966k i/100ms 
        7 30.713k i/100ms 
        8 28.991k i/100ms 
        9 27.115k i/100ms 
------------------------------------------------- 
        5  1.243M (± 4.3%) i/s -  6.203M 
        6  1.202M (± 5.3%) i/s -  6.013M 
        7 373.366k (±13.7%) i/s -  1.843M 
        8 351.945k (± 8.8%) i/s -  1.768M 
        9 331.398k (± 8.2%) i/s -  1.654M 

Comparison: 
        5: 1243005.5 i/s 
        6: 1202032.4 i/s - 1.03x slower 
        7: 373366.5 i/s - 3.33x slower 
        8: 351945.1 i/s - 3.53x slower 
        9: 331398.3 i/s - 3.75x slower 
+0

Prawdopodobnie związany z tym, jak dużo skrótu pasuje do pojedynczej linii pamięci podręcznej. Czy widziałeś podobne drop-offy dla większych haszów? – chepner

Odpowiedz

5

Od Hash lookup in Ruby, why is it so fast?:

Ruby zarządza wielkość pojemniki dynamicznie. Zaczyna się od 11, a gdy jeden z pojemników ma 5 lub więcej elementów, rozmiar pojemnika zostanie zwiększony, a wszystkie elementy mieszające zostaną ponownie przydzielone do nowego odpowiedniego pojemnika.

W pewnym momencie płacisz wykładniczo podwyższoną karę czasową, podczas gdy Ruby zmienia rozmiar puli bin, ale jeśli myślisz o tym, jego wartość jest warta czasu, ponieważ pozwoli to utrzymać czasy wyszukiwania i zużycie pamięci tak niskie, jak to tylko możliwe.

Oznacza to, że im więcej pojemników, tym mniej czasu poświęcamy na szukanie określonego klucza w pojemniku.

Mam nadzieję, że pomaga to zrozumieć zachowanie.

+2

To jest dobra informacja, ale czy możesz zacytować odniesienie do tego? –

+0

@GregBurghardt: zaktualizowano pod numerem –

+1

Dzięki. Nie wiedziałem tego o 'Hash's w Ruby. +1 –

Powiązane problemy