【问题标题】:is Memoization and Cache function execution in javascript are same?javascript中的Memoization和Cache函数执行是否相同?
【发布时间】:2018-12-23 08:43:30
【问题描述】:

我最近接受了一次采访,有人问我如何缓存任何函数的执行?我只听说过 Javascript 中的功能缓存

我检查了Stack overflow,但没有从中得到任何想法。记忆和缓存功能的执行是相同的还是不同的?

我知道 Javascript 中的函数缓存 称为 Memoization,它只缓存结果而不是执行,但 缓存函数执行呢?

【问题讨论】:

  • 你说的是记忆化吗?
  • 也许你读到的和面试官说的其实是一回事,但是因为你们都不知道这个(记忆)的正确术语,所以你很困惑?
  • “缓存执行”对我来说似乎与 js 的 JIT 优化策略有关;几乎可以肯定这不是他们问你的。我认为他们也在谈论记忆。
  • 这就是备忘录
  • 那仍然是记忆。您所指的“缓存函数执行”仍然使用相同的记忆概念,不同之处在于您有一个可以重用的工厂函数。基本上,一个缓存装饰器。您不会直接在 main 函数中添加缓存(如示例 17 中所示),但是,通过组合,您可以将 memoization 添加到您的函数中。 @NullPointer,原始函数根本不知道记忆。例如,您可以有一个普通的“fibonacci”函数,没有缓存,而const fibonacciWithCaching = cacheFn(fibonacci) 有缓存。

标签: javascript memoization


【解决方案1】:

那还是memoization,在优化策略的方式上,两者在缓存数据方面没有区别,但在使用方式上。

通常的记忆会记住(缓存)结果(用于昂贵的函数调用)并在再次出现相同的输入时返回缓存的结果。

“缓存函数执行”使用相同的概念,将其存储在内存中,但这次存储的是函数体本身而不是结果。

【讨论】:

    【解决方案2】:

    是的,通常是一样的。

    有多种方法可以实现它,但想法保持不变 - 避免对函数进行额外计算。这也是与语言无关的事情。

    函数应满足的一个条件是纯度(例如,没有副作用和引用透明性 - 相同的输入给出相同的输出)。这不是函数式编程,但在 FP 中,函数大部分时间都是纯函数。

    因此,如果函数是纯函数,如果我们不执行函数体,而是立即返回缓存值,那么被调用者应该不会注意到任何差异。
    换句话说,如果函数是,那么记忆化和所谓的缓存函数执行之间没有真正的区别,因为返回值将是一样的。


    如果函数不是纯函数怎么办?

    好吧,在这种情况下,显然,如果我们跳过函数体并立即返回一个缓存值——我们将错过函数的副作用。优化这样的功能将导致我们分离纯和不纯的东西,现在我们知道如何处理第一个了:)

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2021-08-09
      • 2016-10-26
      • 1970-01-01
      • 2012-06-22
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多