JS优化/性能:使用JSON.stringify比较对象



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

两个对象的键的顺序相同,因为它们是从同一方法派生的。根据这个答案,最快、最有效的方法是使用JSON.stringify(object1) === JSON.stringify(object2)

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

因此,我想知道JSON.stringify是否也在内部运行某种for循环。在我的应用程序中,这两个对象更有可能不相等。因此,如果JSON.stringify也运行某种for循环,我可以立即删除检查并运行我需要的操作(这只会在两个对象不相等的情况下导致程序的差异),从而节省时间并使其更加优化。如果我不这样做,那么从技术上讲,当两个对象不相等时,我将运行两个完全相同的for循环,而当两个物体相等时,无论哪种方式,我都将运行一个for循环。如果JSON.stringify在内部是某种for循环,那么无论对象是否相等,我都只能有一个for循环。我在这里说得通吗?如果你不明白什么,请告诉我。这个检查没用吗?我应该删除它来优化我的代码吗?

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

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

所以很明显,现在所有JS引擎和操作系统都有了"通用"的答案。

我建议你检查你的密码。。。为什么?

  • 虽然现在属性的顺序可能是不变的,但未来对代码库的维护可能会改变这一点,并引入一个难以追踪的错误
  • 最好为您使用的所有对象类型创建一个isEqual方法
  • 它可读性更好

当然也有缺点:

  • 您的代码将变得更大(这可能会链接到可读性更好的地方)
  • 其他我可能都忘了

最新更新