Comments (3)
@jemmaissroff @ms-ati I explored this a bit and while it improves performance across the board, I was surprised to find that it didn't improve the zero-args case. In fact, the zero-args case gets much worse—it seems the sentinel check adds a lot of overhead!
This result made me think that maybe a better (and much simpler) approach would be to just have something like:
@_memo_wise = {
# These cases are currently fast, so use the existing logic.
no_args: :memoized_value,
positional_arg: { a: :memoized_value },
# These cases are not currently as fast, so use one fewer hash layer.
[:multiple_args, :arg1, :arg2].hash => :memoized_value
}
I confirmed that this approach ☝️ is much faster for the multiple-required-args case, but unfortunately the presence of the .hash
makes it impossible to do reset_memo_wise(:multiple_args)
(at least without using a second data structure like @_memo_wise_hashes = { multiple_args: [hash, hash, hash] }
storing hashes we've used), and without the .hash
performance plummets. 😿
from memo_wise.
Discussed today with @jemmaissroff—we think this is still worth pursuing. Some notes:
- this would only make sense for the
no_args
andpositional_arg
cases in the example above; we'd want to keep themultiple_args
case using a top-level hash key rather than an array lookup and then a hash lookup - we may be able to override a sentinel's truthy behavior to make it falsey, to preserve our truthy optimization behavior, but this would be complex if it's possible at all
- we could only do this for the
positional_arg
case, which doesn't have the sentinel problem because if the value isnil
then we know no argument has been memoized - or we could instead, for the
no_args
case only, have a second "set" bitmap (or array) tell us whether a memoized value has been set or not
- we could only do this for the
- we could store array indexes in a class instance variable (e.g.
@_memo_wise_indices
) that we set/increment in thememo_wise
method
from memo_wise.
This was done in #210 and #211.
from memo_wise.
Related Issues (20)
- Explore using Structs instead of Arrays for hash keys HOT 1
- Investigate whether we can speed up tests
- Method arguments with specific names can be overwritten
- Create easier way to compare changes against current `MemoWise` version HOT 1
- Memowise v1.2.0 regression with Rails concerns HOT 8
- Broken handling of inheritance after "Optimize zero-argument methods" HOT 4
- Avoid defining methods unless needed
- Use squiggly heredocs everywhere
- Multiple composition inheritance bug HOT 8
- Error memo_wising in subclass with included module HOT 2
- Tidy CHANGELOG
- Use method-specific instance variables for methods that take arguments HOT 1
- Use nested hashes instead of arrays for methods with multiple required arguments HOT 2
- Array data structure leading to multiple bugs
- Release 1.4.0 breaks simple inheritance HOT 4
- Cannot use memoized class level method in sub classes HOT 5
- Fix thread safety tests which are non-deterministic on TruffleRuby
- SystemStackError when memoized method calls memoized super method HOT 2
- memo_wise raises error when memoizing a method in a module that's included in a class that overrides `initialize` HOT 1
- Sorbet compatibility
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from memo_wise.