Class: LookupBy::Caching::LRU
- Inherits:
-
Object
- Object
- LookupBy::Caching::LRU
- Defined in:
- lib/lookup_by/caching/lru.rb,
lib/lookup_by/caching/lru_legacy.rb
Direct Known Subclasses
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
- #clear ⇒ Object
- #count ⇒ Object
- #delete(key) ⇒ Object
- #each ⇒ Object
- #fetch(key) ⇒ Object
-
#initialize(max_size) ⇒ LRU
constructor
In Ruby 1.9+, Hash is ordered.
- #key?(key) ⇒ Boolean
- #max_size=(size) ⇒ Object
- #size ⇒ Object
- #to_a ⇒ Object
- #to_h ⇒ Object
- #values ⇒ Object
Constructor Details
#initialize(max_size) ⇒ LRU
In Ruby 1.9+, Hash is ordered.
http://bugs.ruby-lang.org/issues/8312 In Ruby 2.0, Hash#shift is bugged and horribly slow.
require 'benchmark/ips'
hash, i, N = {}, 0, 20_000_000; while i < N; hash[i] = true; i += 1; end
Benchmark.ips do |x|
x.report("shift") { hash.shift }
x.report("first") { hash.delete hash.first[0] }
end
Ruby | shift | first |
---|---|---|
1.9.3-p484 | 264k | 89k |
1.9.3-p551 | 945k | 370k |
2.0.0-p0 | 0k | 70k |
2.0.0-p643 | 0k | 272k |
2.1.5 | 4947k | 3557k |
2.2.1 | 6801k | 4457k |
rbx-2.5.2 | 609k | 409k |
27 28 29 30 |
# File 'lib/lookup_by/caching/lru.rb', line 27 def initialize(max_size) @data = {} self.max_size = max_size end |
Instance Method Details
#[](key) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/lookup_by/caching/lru.rb', line 40 def [](key) found = true value = @data.delete(key) { found = false } @data[key] = value if found end |
#[]=(key, value) ⇒ Object
47 48 49 50 51 |
# File 'lib/lookup_by/caching/lru.rb', line 47 def []=(key, value) @data.delete(key) @data[key] = value @data.shift if @data.length > @max_size end |
#clear ⇒ Object
53 54 55 |
# File 'lib/lookup_by/caching/lru.rb', line 53 def clear @data.clear end |
#count ⇒ Object
57 58 59 |
# File 'lib/lookup_by/caching/lru.rb', line 57 def count @data.length end |
#delete(key) ⇒ Object
61 62 63 |
# File 'lib/lookup_by/caching/lru.rb', line 61 def delete(key) @data.delete(key) end |
#each ⇒ Object
65 66 67 68 69 |
# File 'lib/lookup_by/caching/lru.rb', line 65 def each @data.to_a.each do |pair| yield pair end end |
#fetch(key) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/lookup_by/caching/lru.rb', line 71 def fetch(key) found = true value = @data.delete(key) { found = false } if found @data[key] = value elsif block_given? value = @data[key] = yield key @data.shift if @data.length > @max_size value else raise KeyError, "key not found: %p" % [key] end end |
#key?(key) ⇒ Boolean
86 87 88 |
# File 'lib/lookup_by/caching/lru.rb', line 86 def key?(key) @data.key?(key) end |
#max_size=(size) ⇒ Object
32 33 34 35 36 37 38 |
# File 'lib/lookup_by/caching/lru.rb', line 32 def max_size=(size) raise ArgumentError.new(:maxsize) if size < 1 @max_size = size @data.shift while @data.length > @max_size end |
#size ⇒ Object
90 91 92 |
# File 'lib/lookup_by/caching/lru.rb', line 90 def size @data.size end |
#to_a ⇒ Object
94 95 96 |
# File 'lib/lookup_by/caching/lru.rb', line 94 def to_a @data.to_a end |
#to_h ⇒ Object
98 99 100 |
# File 'lib/lookup_by/caching/lru.rb', line 98 def to_h @data.dup end |
#values ⇒ Object
102 103 104 |
# File 'lib/lookup_by/caching/lru.rb', line 102 def values @data.values end |