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



假设您有一个打字稿对象,任何元素都可以为 undefined。如果要访问重嵌套的组件,则必须与undefined进行很多比较。

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

我找到了这个漂亮的工具,称为 jsben 您是否可以对不同的JS代码进行基准测试。但是,我无法正确解释结果。

在此测试中,Lodash get似乎稍快地。但是,如果我在Setup block中定义了我的变量(与Boilerplate code相反),则if-else代码的速度更快。

基准所有这些的正确方法是什么?我应该如何解释结果?get是否这么慢,尽管可读性非常差,您可以提出支持if-else条款的论点?

我想您在问错误的问题。

首先,如果您要进行性能微观优化(与算法优化相对),则您真的应该知道所涉及的代码是否是系统中的瓶颈。修复最坏的瓶颈,直到您的性能很好,然后不要担心它。如果这些变化在严重的应用中远不止是四舍五入的错误,我会感到非常惊讶。但是我以前感到惊讶。因此需要 test

然后,当涉及实际优化时,这两个实现的速度仅略有不同。但是,如果您想测试对对象的深入访问,看来第二个是思考的正确方法。似乎并没有在相对速度上有很大的差异,但是第一个将初始化代码"在每个块之前执行,并且是基准的一部分"。第二个将其放置在"每次测试之前都会运行它,而不是基准的一部分"。由于您想比较数据访问而不是数据初始化,因此这似乎更合适。

鉴于此,families && families.Trump && families.Trump.members && ...技术似乎具有很小的性能优势。(注意:在此处看到的if S或else S!)

但是值得吗?我不会说。该代码要丑陋得多。我不会添加诸如lodash(或我喜欢的Ramda)之类的库,只是为了简单地使用函数,但是如果我已经使用了Lodash,我会毫不犹豫地在此处使用更简单的代码。我可能会从lodash或ramda导入一个,或者只是简单地编写我的否则,因为它很简单。

本机代码要比更多的通用库代码更快,这不足为奇。并非总是会发生这种情况,因为有时库会采取本机发动机无法做到的快捷方式,但这很可能是常态。使用这些库的原因很少与性能有关,而与编写更多表达代码有关。在这里,Lodash版本赢了。

基准所有这些的正确方法是什么?

仅根据您要比较的实际代码,在测试块之外尽可能多地移动。将两件(数百万次)中的每一个运行,以平均消除其他部分的影响。

我应该如何解释结果?

1)检查它们是否有效:

结果符合您的期望吗?如果没有,可能会有原因吗?测试柜是否复制您的实际用途?

2)检查结果是否相关:

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

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

通常,您必须进行很多重构,或者您必须输入很多,表现会在您投资的时间内超重吗?

尽管可读性非常差,但您可以提出速度较慢,以至于您可以提出争议以支持If-Else条款?

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

最新更新