Javascript lodash之间的性能差异;获得;及;如有其他",;条款
假设您有一个typescript对象,其中任何元素都可以是Javascript lodash之间的性能差异;获得;及;如有其他",;条款,javascript,json,typescript,lodash,benchmarking,Javascript,Json,Typescript,Lodash,Benchmarking,假设您有一个typescript对象,其中任何元素都可以是未定义的。如果要访问嵌套较多的组件,必须与未定义的进行大量比较 我想从性能方面比较两种方法:常规if-else比较和lodash函数get 我发现这个漂亮的工具叫做jsben,你可以对不同的js代码进行基准测试。然而,我未能正确解释结果 在这种情况下,lodashget似乎稍微快一点。然而,(与样板代码)相反,if-else代码的速度要快得多 对所有这些进行基准测试的正确方法是什么? 我应该如何解释结果? 是不是get的速度太慢了以至于你
未定义的
。如果要访问嵌套较多的组件,必须与未定义的
进行大量比较
我想从性能方面比较两种方法:常规if-else
比较和lodash函数get
我发现这个漂亮的工具叫做jsben,你可以对不同的js代码进行基准测试。然而,我未能正确解释结果
在这种情况下,lodashget
似乎稍微快一点。然而,(与样板代码
)相反,if-else
代码的速度要快得多
对所有这些进行基准测试的正确方法是什么?
我应该如何解释结果?
是不是get
的速度太慢了以至于你可以在可读性很差的情况下支持if-else
子句
对所有这些进行基准测试的正确方法是什么
仅对正在比较的实际代码进行基准测试,尽可能地将其移出测试块。将这两个部件各运行几(十万)次,以平均其他部件的影响
我应该如何解释结果
1) 检查它们是否有效:
结果符合你的期望吗?
如果不是,有什么原因吗?
测试用例是否复制了您的实际用例
2) 检查结果是否相关:
它所花费的时间与用例中的实际时间相比如何?如果您的代码需要200毫秒才能加载,并且两个测试都在~1毫秒的时间内运行,那么您的结果并不重要。然而,如果您试图优化每秒运行60次的代码,1ms已经是很多了
3) 检查结果是否值得付出努力
通常,您必须进行大量重构,或者必须大量键入,性能收益是否超过您投入的时间
是不是变得太慢了,以至于你们可以在可读性很差的情况下支持if-else条款
我会说不。使用
。
(除非你计划每秒运行几百次)。我认为你问错了问题
首先,如果您要进行性能微观优化(与算法优化相反),您应该真正了解所讨论的代码是否是系统中的瓶颈。修复最严重的瓶颈,直到您的性能良好,然后停止过度担心它。如果在一个严肃的应用程序中,这些变量之间的差异超过了舍入误差,我会非常惊讶。但我以前很惊讶;因此需要进行测试
然后,当涉及到实际优化时,这两种实现在速度上只是略有不同,无论是在哪种配置中。但是,如果您想测试对对象的深度访问,那么第二种方法似乎是正确的。它似乎不应该在相对速度上有太大的差别,但是第一个将初始化代码放在“在每个块之前执行,并且是基准测试的一部分”的位置。第二个将初始化代码放在“在每个测试之前运行,并且不是基准测试的一部分”的位置因为您希望比较数据访问而不是数据初始化,所以这似乎更合适
鉴于此,families&&families.Trump&&families.Trump.members&&…
技术似乎有一点性能优势。(注意:此处看不到任何if
s或else
s!)
但是值得吗?我想说不是。代码非常非常丑陋。我不会仅仅为了使用这么简单的函数而添加像lodash(或我最喜欢的)这样的库,但是如果我已经在使用lodash,我会毫不犹豫地在这里使用更简单的代码。我可能会从lodash或Ramda中导入一个,或者简单地编写自己的代码,因为这是相当简单的代码
本机代码将比更通用的库代码更快,这并不令人惊讶。这种情况并不总是发生,因为有时库会采用本机引擎无法实现的快捷方式,但这很可能是常态。使用这些库的原因很少与性能有关,而是与编写更具表现力的代码有关。在这里,lodash版本胜出,请举手。使用可读性更强的版本。我运行了你的两个测试,但没有得到两个测试之间的主要区别……”有时库会走本机引擎无法走的捷径“我宁愿说库作者有时真的知道他们在做什么……”Jonaswillms:我希望如此(作为这些库作者之一)。关键是
Array.prototype.map
的规范相当复杂。但是MyLib.map
甚至不必尝试它所做的一切。它也可以选择做更多的事情。有时这会导致显著的性能差异。