Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript lodash之间的性能差异;获得;及;如有其他",;条款_Javascript_Json_Typescript_Lodash_Benchmarking - Fatal编程技术网

Javascript lodash之间的性能差异;获得;及;如有其他",;条款

Javascript lodash之间的性能差异;获得;及;如有其他",;条款,javascript,json,typescript,lodash,benchmarking,Javascript,Json,Typescript,Lodash,Benchmarking,假设您有一个typescript对象,其中任何元素都可以是未定义的。如果要访问嵌套较多的组件,必须与未定义的进行大量比较 我想从性能方面比较两种方法:常规if-else比较和lodash函数get 我发现这个漂亮的工具叫做jsben,你可以对不同的js代码进行基准测试。然而,我未能正确解释结果 在这种情况下,lodashget似乎稍微快一点。然而,(与样板代码)相反,if-else代码的速度要快得多 对所有这些进行基准测试的正确方法是什么? 我应该如何解释结果? 是不是get的速度太慢了以至于你

假设您有一个typescript对象,其中任何元素都可以是
未定义的
。如果要访问嵌套较多的组件,必须与
未定义的
进行大量比较

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

我发现这个漂亮的工具叫做jsben,你可以对不同的js代码进行基准测试。然而,我未能正确解释结果

在这种情况下,lodash
get
似乎稍微快一点。然而,(与
样板代码
)相反,
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
甚至不必尝试它所做的一切。它也可以选择做更多的事情。有时这会导致显著的性能差异。