Giter VIP home page Giter VIP logo

Comments (3)

JacobEvelyn avatar JacobEvelyn commented on July 19, 2024

@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.

JacobEvelyn avatar JacobEvelyn commented on July 19, 2024

Discussed today with @jemmaissroff—we think this is still worth pursuing. Some notes:

  • this would only make sense for the no_args and positional_arg cases in the example above; we'd want to keep the multiple_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 is nil 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 store array indexes in a class instance variable (e.g. @_memo_wise_indices) that we set/increment in the memo_wise method

from memo_wise.

JacobEvelyn avatar JacobEvelyn commented on July 19, 2024

This was done in #210 and #211.

from memo_wise.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.