lodash "get" 和 "if else" 子句之间的性能差异

Performance difference between lodash "get" and "if else" clauses

假设您有一个打字稿对象,其中任何元素都可以是 undefined。如果你想访问一个重度嵌套的组件,你必须对 undefined.

做大量的比较

我想在性能方面比较两种执行此操作的方法:常规 if-else 比较和 lodash 函数 get

我发现了一个名为 jsben 的漂亮工具,您可以用它对不同的 js 代码片段进行基准测试。但是,我未能正确解释结果。

在此 test, lodash get seems to be slightly faster. However, if I define my variable in the Setup block 中(与 Boilerplate code 相对),if-else 代码的速度要快得多。

对所有这些进行基准测试的正确方法是什么? 我应该如何解释结果? 尽管可读性很差,get 是否慢得多以至于您可以支持 if-else 子句?

What is the proper way of benchmarking all this?

只对你正在比较的实际代码进行基准测试,尽可能多地移动到测试块之外。 运行两个部分各做几(十)千次,平均掉其他部分的影响。

How should I interpret the results?

1) 检查它们是否有效:

结果符合您的预期吗? 如果不是,是否有原因? 测试用例是否复制了您的实际用例?

2) 检查结果是否相关:

与您的用例中的实际时间相比,它花费的时间如何?如果您的代码需要 200 毫秒来加载,并且两个测试 运行 都在 ~1 毫秒内,那么您的结果并不重要。但是,如果您尝试优化每秒 运行s 60 次的代码,那么 1 毫秒已经很多了。

3) 检查结果是否值得付出努力

通常您必须进行大量重构,或者必须输入大量内容,性能收益是否超过您投入的时间?

Is get so much slower that you can make argument in favour of if-else clauses, in spite of the very poor readability?

我会说不。使用 _.get(除非您计划 运行 每秒几百次)。

我认为你问错了问题。

首先,如果您要进行性能微优化(相对于算法优化),您应该真正了解相关代码是否是您系统中的瓶颈。解决最严重的瓶颈,直到您的性能良好,然后再过分担心它。如果这些之间的差异在严肃的应用程序中超过舍入误差,我会感到非常惊讶。但是我以前很惊讶;因此需要测试.

然后,当涉及到实际优化时,无论是哪种配置,这两种实现在速度上仅略有不同。但是如果你想测试对你的对象的深度访问,看起来第二种方法是正确的思考方式。它似乎不会对相对速度产生太大影响,但第一个将初始化代码放在 "executed before every block and is part of the benchmark." 的位置,第二个将它放在 "it will be run before every test, and is not part of the benchmark." 的位置,因为你想比较数据访问而不是数据初始化,这似乎更合适。

鉴于此,families && families.Trump && families.Trump.members && ... 技术似乎具有非常轻微的性能优势。 (注意:这里看不到 ifelse!)

但这值得吗?我会说不是。代码要丑得多。我不会为了使用像这样简单的函数而添加诸如 lodash(或我最喜欢的 Ramda)之类的库,但如果我已经在使用 lodash,我会毫不犹豫地在此处使用更简单的代码。我可能会从 lodash 或 Ramda 导入一个,或者干脆自己写一个,因为它是相当简单的代码。

本机代码将比更通用的库代码更快,这不足为奇。它并不总是会发生,因为有时库会走原生引擎无法走的捷径,但这可能是常态。使用这些库的原因很少与性能有关,而是与编写更具表现力的代码有关。在这里,lodash 版本胜出,毫无疑问。