【问题标题】:JS Optimization/Performance: Comparing objects using JSON.stringifyJS 优化/性能:使用 JSON.stringify 比较对象
【发布时间】:2018-12-31 00:11:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript performance loops object optimization


    【解决方案1】:

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

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

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

    我建议你检查你的代码...为什么?

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

    当然也有缺点:

    • 您的代码将变得更大(这可能与更好的可读性有关)
    • 还有什么我可能忘记了。

    【讨论】:

    • 您所说的“签入代码”是什么意思?抱歉,我知道这是一个错字,但我无法准确推断出您的意思。所以为了更清楚,您建议先检查相等性,对吗?
    • 好收获!修正了错字。我所说的“在你的代码中进行检查”的意思是要么自己运行一个for 循环,要么只是将它作为每个相关属性的一个条件写出来——这使得 JITer 更容易创建快速代码。跨度>
    猜你喜欢
    • 2019-08-23
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多