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

问题描述 投票:1回答:2

假设你有一个打字稿对象,其中任何元素都可以是undefined。如果要访问重度嵌套的组件,则必须对undefined进行大量比较。

我想在性能方面比较两种方法:常规if-else比较和lodash函数get

我发现这个名为jsben的漂亮工具你可以对不同的js代码进行基准测试。但是,我无法正确解释结果。

在这个test,lodash get似乎稍快。然而,if I define my variable in the Setup block(而不是Boilerplate code),if-else代码更快。

对所有这些进行基准测试的正确方法是什么?我该如何解释结果呢? get是如此之慢,以至于你可以支持if-else条款,尽管可读性很差?

javascript json typescript lodash benchmarking
2个回答
2
投票

我想你问的是错误的问题。

首先,如果您要进行性能微优化(而不是算法优化),您应该真正了解所讨论的代码是否是系统中的瓶颈。解决最糟糕的瓶颈,直到你的表现良好,然后不要再担心它了。如果在严重的应用程序中这些差异超过舍入错误,我会感到非常惊讶。但我以前一直很惊讶;因此需要测试。

然后,当涉及到实际优化时,两种实现在两种配置中的速度都略有不同。但是如果你想测试对你的对象的深层访问,看起来第二个是正确的思考方式。它似乎不应该在相对速度上有很大的不同,但是第一个将初始化代码放在“在每个块之前执行并且是基准测试的一部分”的地方。第二个是“它将在每次测试之前运行,而不是基准测试的一部分”。由于您想要比较数据访问而不是数据初始化,这似乎更合适。

鉴于此,families && families.Trump && families.Trump.members && ...技术似乎有一个非常轻微的性能优势。 (注意:这里没有ifs或elses!)

但是这值得吗?我会说不。代码非常多,更加丑陋。我不会添加像lodash(或我最喜欢的,Ramda)这样的库只是为了使用像这样简单的函数,但是如果我已经在使用lodash,我会毫不犹豫地在这里使用更简单的代码。我可以从lodash或Ramda导入一个,或者只是自己编写,因为它是相当简单的代码。

该本机代码将比更通用的库代码更快不应该是一个惊喜。它并不总是会发生,因为有时库会采用本机引擎无法获得的快捷方式,但它很可能是常态。使用这些库的原因很少与性能有关,而是编写更具表现力的代码。在这里,lodash版本赢得了胜利。


1
投票

对所有这些进行基准测试的正确方法是什么?

仅对您要比较的实际代码进行基准测试,尽可能在测试块之外移动。将这两件中的每一件运行几百(一万)次,以平均其他部件的影响。

我该如何解释结果呢?

1)检查它们是否有效:

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

2)检查结果是否相关:

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

3)检查结果是否值得工作

通常你需要进行大量的重构,或者你必须输入很多,你投资的时候性能会增加吗?

尽管可读性非常差,但是你可以加快if-else子句的争论吗?

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

© www.soinside.com 2019 - 2024. All rights reserved.