假设您有一个打字稿对象,任何元素都可以为 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
(除非您打算每秒运行几百次)。