JS优化/性能:使用JSON.stringify

时间:2018-12-31 00:11:00

标签: javascript performance loops object optimization

我目前正在构建一个小型应用程序,是Vanilla JS(没有像lodash / jquery这样的任何依赖项),我需要比较两个对象以检查键和值是否相等。我只是想知道如何优化这个问题。

两个对象的键的顺序与从相同方法派生的键相同。根据此answer,最快,最有效的方法是使用JSON.stringify(object1) === JSON.stringify(object2)

但是,在我的应用程序中,如果两个对象不相等,那么我将遍历两个对象并执行一些操作。问题在于这些操作的性能相当高,并且偶尔会运行。我需要优化我的解决方案。

因此,我想知道JSON.stringify是否也在内部运行某种for循环。在我的应用程序中,两个对象不平等的可能性更大。因此,如果JSON.stringify也运行某种类型的for循环,我可以删除检查并立即运行所需的操作(,这只会在程序中造成差异,如果两者对象不相等),从而节省了时间并对其进行了优化。如果我不这样做,那么从技术上讲,当两个对象不相等时,将出于相同的目的运行两个for循环,而当两个对象相等时,将以两种方式运行一个for循环。如果JSON.stringify在内部是某种for循环,那么无论对象是否相等,我都只能循环一个for。我在这里有意义吗?如果您听不懂,请告诉我。此检查没用吗,我应该删除它以优化代码吗?

1 个答案:

答案 0 :(得分:1)

您的问题涉及4个不同的领域:

  • JSON.stringify的实现(以及性能)
  • 对象迭代的实现(以及性能)
  • JIT编译器的质量和性能
  • 内存分配的速度(JSON.stringify是大对象的内存消耗)

因此,很明显,现在所有JS引擎和OS都有“通用”答案。

我建议您检查代码中的内容...为什么?

  • 虽然现在属性的顺序可能是恒定的,但是将来对代码库的维护可能会改变这种情况,并引入难以跟踪的错误。
  • 为所有使用的对象类型创建isEqual方法是一种很好的做法
  • 可读性更好。

当然也有缺点:

  • 您的代码将变得更大(这可能与更好的可读性有关)
  • 我可能会忘记的其他东西。