memonic 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +5 -0
- data/lib/memonic.rb +18 -6
- data/lib/memonic/version.rb +1 -1
- data/spec/memonic_spec.rb +6 -1
- 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: 0fc00b69e78cf989af051b858a3c4089ecf7cc74
|
4
|
+
data.tar.gz: 1a485d6ea4594d13607dc2fec5782845faf09bb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d18ad8bb33991680d7d7a69975387c321708073994eed5dd8a774a09e9c2e083f61c09287e843048204924f4d80ce8a5694d934357aeb4fb787bb64a100fabdd
|
7
|
+
data.tar.gz: bb4d536f13bfa0b0e9d287693ccd1e74675b0858db3e27fb698db4f0be266a3e255a55826cec9b42e071a2f499aecdc2df411e8a6b490bfc5af267bf4562e528
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 1.0.3
|
2
|
+
|
3
|
+
- More performance improvements (details below).
|
4
|
+
- Calling `memoize(:value) { ... }` now defines a `__value___` method as well
|
5
|
+
as a `value` method.
|
6
|
+
|
7
|
+
### Performance improvements
|
8
|
+
|
9
|
+
1. The instance version of `memoize` now only checks with the variable is
|
10
|
+
defined if `instance_variable_get` returns a false value. This yields a
|
11
|
+
modest improvement in performance.
|
12
|
+
2. The class version of `memoize` no longer piggy-backs on the instance
|
13
|
+
version. Instead it defines a `__value__` method using the provided block,
|
14
|
+
then defines a `value` method using `class_eval`. This yields a dramatic
|
15
|
+
improvement in performance, making the class version almost as fast as
|
16
|
+
doing it yourself.
|
17
|
+
|
1
18
|
## 1.0.2
|
2
19
|
|
3
20
|
Performance improvement.
|
data/README.md
CHANGED
@@ -44,6 +44,11 @@ you would want to use it, but if you do, here's how:
|
|
44
44
|
|
45
45
|
Note that the '@' prefix **is** necessary.
|
46
46
|
|
47
|
+
## Notes
|
48
|
+
|
49
|
+
Calling `memoize(:value) { ... }` on the class defines a `__value__` method
|
50
|
+
as well as `value`.
|
51
|
+
|
47
52
|
## Background
|
48
53
|
|
49
54
|
Memoization is a common optimization technique in which the result of a
|
data/lib/memonic.rb
CHANGED
@@ -8,17 +8,29 @@ module Memonic
|
|
8
8
|
private
|
9
9
|
|
10
10
|
def memoize(variable, &block)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
instance_variable_get(variable) || begin
|
12
|
+
if instance_variable_defined?(variable)
|
13
|
+
instance_variable_get(variable)
|
14
|
+
else
|
15
|
+
instance_variable_set(variable, instance_exec(&block))
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
20
|
module ClassMethods
|
19
21
|
def memoize(name, &block)
|
20
|
-
|
21
|
-
|
22
|
+
define_method("__#{name}__", &block)
|
23
|
+
class_eval <<-RUBY
|
24
|
+
def #{name}
|
25
|
+
@#{name} || begin
|
26
|
+
if defined?(@#{name})
|
27
|
+
@#{name}
|
28
|
+
else
|
29
|
+
@#{name} = __#{name}__
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
RUBY
|
22
34
|
end
|
23
35
|
end
|
24
36
|
end
|
data/lib/memonic/version.rb
CHANGED
data/spec/memonic_spec.rb
CHANGED
@@ -7,7 +7,12 @@ describe Memonic do
|
|
7
7
|
allow(memoizer).to receive(:computation).and_call_original
|
8
8
|
end
|
9
9
|
|
10
|
-
it "returns the computation result" do
|
10
|
+
it "returns the computation result on the first call" do
|
11
|
+
expect(memoizer.value).to be result
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns the same result on subsequent calls" do
|
15
|
+
memoizer.value
|
11
16
|
expect(memoizer.value).to be result
|
12
17
|
end
|
13
18
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memonic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Carney
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|