lru_redux 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +17 -12
- data/lib/lru_redux/cache.rb +35 -34
- data/lib/lru_redux/thread_safe_cache.rb +1 -1
- data/lib/lru_redux/version.rb +1 -1
- data/test/cache_test.rb +21 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: af4d80362e99b12a12ab32c6a8274f216195d666
         | 
| 4 | 
            +
              data.tar.gz: 1d68495be201eadc3c851b4efdfb6efb7128e710
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a836ef1195b172d1d3bf9f4091e8fbfd5802546ef45504f75d0db2842d1943a83df9df83b0138eb199deea1e52449bb7ef2613a8bfb386b5e81c8d42df7a7d5a
         | 
| 7 | 
            +
              data.tar.gz: 25cce1c929ad8eda1975d3af356b9705f114042f85d14a5b4aa7a128be89f12dc3cfe6b8a93837a692a9f7932efd6ff753592e216972760c1e20b61e4736b557
         | 
    
        data/README.md
    CHANGED
    
    | @@ -45,19 +45,19 @@ see: benchmark directory | |
| 45 45 | 
             
            ```
         | 
| 46 46 | 
             
            sam@ubuntu:~/Source/lru_redux/bench$ ruby ./bench.rb
         | 
| 47 47 | 
             
            Rehearsal ---------------------------------------------------------
         | 
| 48 | 
            -
            thread safe lru        27. | 
| 49 | 
            -
            lru gem                 2. | 
| 50 | 
            -
            lru_cache gem            | 
| 51 | 
            -
            lru_redux gem           1. | 
| 52 | 
            -
            lru_redux thread safe   2. | 
| 53 | 
            -
            ----------------------------------------------- total: 36. | 
| 48 | 
            +
            thread safe lru        27.640000   0.370000  28.010000 ( 28.049021)
         | 
| 49 | 
            +
            lru gem                 2.460000   0.000000   2.460000 (  2.454292)
         | 
| 50 | 
            +
            lru_cache gem           2.170000   0.000000   2.170000 (  2.174306)
         | 
| 51 | 
            +
            lru_redux gem           1.530000   0.020000   1.550000 (  1.552481)
         | 
| 52 | 
            +
            lru_redux thread safe   2.610000   0.070000   2.680000 (  2.684895)
         | 
| 53 | 
            +
            ----------------------------------------------- total: 36.870000sec
         | 
| 54 54 |  | 
| 55 55 | 
             
                                        user     system      total        real
         | 
| 56 | 
            -
            thread safe lru         | 
| 57 | 
            -
            lru gem                 2. | 
| 58 | 
            -
            lru_cache gem            | 
| 59 | 
            -
            lru_redux gem           1. | 
| 60 | 
            -
            lru_redux thread safe   2. | 
| 56 | 
            +
            thread safe lru        28.170000   0.280000  28.450000 ( 28.465008)
         | 
| 57 | 
            +
            lru gem                 2.330000   0.000000   2.330000 (  2.328316)
         | 
| 58 | 
            +
            lru_cache gem           2.140000   0.000000   2.140000 (  2.142749)
         | 
| 59 | 
            +
            lru_redux gem           1.640000   0.000000   1.640000 (  1.643732)
         | 
| 60 | 
            +
            lru_redux thread safe   2.590000   0.000000   2.590000 (  2.600422)
         | 
| 61 61 |  | 
| 62 62 | 
             
            ```
         | 
| 63 63 |  | 
| @@ -72,6 +72,11 @@ lru_redux thread safe   2.750000   0.000000   2.750000 (  2.752526) | |
| 72 72 |  | 
| 73 73 | 
             
            ## Changlog
         | 
| 74 74 |  | 
| 75 | 
            -
            ### | 
| 75 | 
            +
            ###version 0.0.2 - 23-April-2013
         | 
| 76 76 |  | 
| 77 77 | 
             
            - Added .clear method
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            ###version 0.0.3 - 23-April-2013
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            - Added .max_size= so you can resize caches on demand
         | 
| 82 | 
            +
            - Added implemented using arrays for extra perf
         | 
    
        data/lib/lru_redux/cache.rb
    CHANGED
    
    | @@ -2,6 +2,8 @@ class LruRedux::Cache | |
| 2 2 |  | 
| 3 3 | 
             
              # for high efficiency nodes in double linked list are stored in arrays
         | 
| 4 4 | 
             
              # [prev,key,val,next]
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              # This makes this much more annoying to code, but gives us a 5-10% edge
         | 
| 5 7 |  | 
| 6 8 | 
             
              def initialize(max_size)
         | 
| 7 9 | 
             
                @max_size = max_size
         | 
| @@ -10,11 +12,17 @@ class LruRedux::Cache | |
| 10 12 | 
             
                @tail = nil
         | 
| 11 13 | 
             
              end
         | 
| 12 14 |  | 
| 15 | 
            +
              def max_size=(size)
         | 
| 16 | 
            +
                @max_size = size
         | 
| 17 | 
            +
                while pop_tail
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 13 21 | 
             
              def [](key)
         | 
| 14 22 | 
             
                node = @data[key]
         | 
| 15 23 | 
             
                if node
         | 
| 16 24 | 
             
                  move_to_head(node)
         | 
| 17 | 
            -
                  node | 
| 25 | 
            +
                  node[2]
         | 
| 18 26 | 
             
                end
         | 
| 19 27 | 
             
              end
         | 
| 20 28 |  | 
| @@ -22,7 +30,7 @@ class LruRedux::Cache | |
| 22 30 | 
             
                node = @data[key]
         | 
| 23 31 | 
             
                if node
         | 
| 24 32 | 
             
                  move_to_head(node)
         | 
| 25 | 
            -
                  node | 
| 33 | 
            +
                  node[2] = val
         | 
| 26 34 | 
             
                else
         | 
| 27 35 | 
             
                  pop_tail
         | 
| 28 36 | 
             
                  @data[key] = add_to_head(key,val)
         | 
| @@ -33,8 +41,8 @@ class LruRedux::Cache | |
| 33 41 | 
             
              def each
         | 
| 34 42 | 
             
                if n = @head
         | 
| 35 43 | 
             
                  while n
         | 
| 36 | 
            -
                    yield [n | 
| 37 | 
            -
                    n = n | 
| 44 | 
            +
                    yield [n[1], n[2]]
         | 
| 45 | 
            +
                    n = n[0]
         | 
| 38 46 | 
             
                  end
         | 
| 39 47 | 
             
                end
         | 
| 40 48 | 
             
              end
         | 
| @@ -54,11 +62,11 @@ class LruRedux::Cache | |
| 54 62 | 
             
                node = @data[k]
         | 
| 55 63 | 
             
                if node
         | 
| 56 64 | 
             
                  @data.delete(k)
         | 
| 57 | 
            -
                  prev = node | 
| 58 | 
            -
                  nex = node | 
| 65 | 
            +
                  prev = node[0]
         | 
| 66 | 
            +
                  nex = node[3]
         | 
| 59 67 |  | 
| 60 | 
            -
                  prev | 
| 61 | 
            -
                  nex | 
| 68 | 
            +
                  prev[3] = nex if prev
         | 
| 69 | 
            +
                  nex[0] = prev if nex
         | 
| 62 70 | 
             
                end
         | 
| 63 71 | 
             
              end
         | 
| 64 72 |  | 
| @@ -74,60 +82,53 @@ class LruRedux::Cache | |
| 74 82 | 
             
              # for cache validation only, ensures all is sound
         | 
| 75 83 | 
             
              def valid?
         | 
| 76 84 | 
             
                expected = {}
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                count = 0
         | 
| 77 87 | 
             
                self.each_unsafe do |k,v|
         | 
| 78 | 
            -
                   | 
| 88 | 
            +
                  return false if @data[k][2] != v
         | 
| 89 | 
            +
                  count += 1
         | 
| 79 90 | 
             
                end
         | 
| 80 | 
            -
                 | 
| 91 | 
            +
                count == @data.count
         | 
| 81 92 | 
             
              end
         | 
| 82 93 |  | 
| 83 94 | 
             
              protected
         | 
| 84 95 |  | 
| 85 96 | 
             
              def add_to_head(key,val)
         | 
| 86 97 | 
             
                if @head.nil?
         | 
| 87 | 
            -
                  @tail = @head =  | 
| 98 | 
            +
                  @tail = @head = [nil,key,val,nil]
         | 
| 88 99 | 
             
                else
         | 
| 89 | 
            -
                  node =  | 
| 90 | 
            -
                  @head = @head | 
| 100 | 
            +
                  node = [@head,key,val,nil]
         | 
| 101 | 
            +
                  @head = @head[3] = node
         | 
| 91 102 | 
             
                end
         | 
| 92 103 | 
             
              end
         | 
| 93 104 |  | 
| 94 105 | 
             
              def move_to_head(node)
         | 
| 95 | 
            -
                return unless @head && node != @head
         | 
| 106 | 
            +
                return unless @head && node[1] != @head[1]
         | 
| 96 107 |  | 
| 97 | 
            -
                prev = node | 
| 98 | 
            -
                nex = node | 
| 108 | 
            +
                prev = node[0]
         | 
| 109 | 
            +
                nex = node[3]
         | 
| 99 110 |  | 
| 100 111 | 
             
                if prev
         | 
| 101 | 
            -
                  prev | 
| 112 | 
            +
                  prev[3] = nex
         | 
| 102 113 | 
             
                else
         | 
| 103 114 | 
             
                  @tail = nex
         | 
| 104 115 | 
             
                end
         | 
| 105 116 |  | 
| 106 117 | 
             
                if nex
         | 
| 107 | 
            -
                  nex | 
| 118 | 
            +
                  nex[0] = prev
         | 
| 108 119 | 
             
                end
         | 
| 109 120 |  | 
| 110 | 
            -
                @head | 
| 111 | 
            -
                node | 
| 121 | 
            +
                @head[3] = node
         | 
| 122 | 
            +
                node[0] = @head
         | 
| 112 123 | 
             
                @head = node
         | 
| 113 124 | 
             
              end
         | 
| 114 125 |  | 
| 115 126 | 
             
              def pop_tail
         | 
| 116 | 
            -
                if @data.length  | 
| 117 | 
            -
                  @data.delete(@tail | 
| 118 | 
            -
                  @tail = @tail | 
| 119 | 
            -
                  @tail | 
| 127 | 
            +
                if @data.length >= @max_size
         | 
| 128 | 
            +
                  @data.delete(@tail[1])
         | 
| 129 | 
            +
                  @tail = @tail[3]
         | 
| 130 | 
            +
                  @tail[0] = nil
         | 
| 120 131 | 
             
                end
         | 
| 121 132 | 
             
              end
         | 
| 122 133 |  | 
| 123 | 
            -
             | 
| 124 | 
            -
              class Node
         | 
| 125 | 
            -
                attr_accessor :key, :value, :next, :prev
         | 
| 126 | 
            -
                def initialize(key,value,prev,nex)
         | 
| 127 | 
            -
                  self.key = key
         | 
| 128 | 
            -
                  self.value = value
         | 
| 129 | 
            -
                  self.prev = prev
         | 
| 130 | 
            -
                  self.next = nex
         | 
| 131 | 
            -
                end
         | 
| 132 | 
            -
              end
         | 
| 133 134 | 
             
            end
         | 
    
        data/lib/lru_redux/version.rb
    CHANGED
    
    
    
        data/test/cache_test.rb
    CHANGED
    
    | @@ -7,6 +7,10 @@ class CacheTest < MiniTest::Unit::TestCase | |
| 7 7 | 
             
                @c = LruRedux::Cache.new(3)
         | 
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 | 
            +
              def teardown
         | 
| 11 | 
            +
                assert_equal true, @c.valid?
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 10 14 | 
             
              def test_drops_old
         | 
| 11 15 | 
             
                @c[:a] = 1
         | 
| 12 16 | 
             
                @c[:b] = 2
         | 
| @@ -56,4 +60,21 @@ class CacheTest < MiniTest::Unit::TestCase | |
| 56 60 | 
             
                @c.clear
         | 
| 57 61 | 
             
                assert_equal [], @c.to_a
         | 
| 58 62 | 
             
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              def test_grow
         | 
| 65 | 
            +
                @c[:a] = 1
         | 
| 66 | 
            +
                @c[:b] = 2
         | 
| 67 | 
            +
                @c[:c] = 3
         | 
| 68 | 
            +
                @c.max_size = 4
         | 
| 69 | 
            +
                @c[:d] = 4
         | 
| 70 | 
            +
                assert_equal [[:d,4],[:c,3],[:b,2],[:a,1]], @c.to_a
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              def test_shrink
         | 
| 74 | 
            +
                @c[:a] = 1
         | 
| 75 | 
            +
                @c[:b] = 2
         | 
| 76 | 
            +
                @c[:c] = 3
         | 
| 77 | 
            +
                @c.max_size = 2
         | 
| 78 | 
            +
                assert_equal [[:c,3],[:b,2]], @c.to_a
         | 
| 79 | 
            +
              end
         | 
| 59 80 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: lru_redux
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sam Saffron
         | 
| @@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 135 135 | 
             
                  version: '0'
         | 
| 136 136 | 
             
            requirements: []
         | 
| 137 137 | 
             
            rubyforge_project: 
         | 
| 138 | 
            -
            rubygems_version: 2.0. | 
| 138 | 
            +
            rubygems_version: 2.0.3
         | 
| 139 139 | 
             
            signing_key: 
         | 
| 140 140 | 
             
            specification_version: 4
         | 
| 141 141 | 
             
            summary: An efficient implementation of an lru cache
         |