在这种情况下,lastIndexOf() 如何比 indexOf() 好? [复制]

Posted

技术标签:

【中文标题】在这种情况下,lastIndexOf() 如何比 indexOf() 好? [复制]【英文标题】:How is lastIndexOf() better than indexOf() in this case? [duplicate] 【发布时间】:2018-12-16 14:32:52 【问题描述】:

以下是 Google 对 String.startsWith() 的实现,取自 Closure 库:

goog.string.startsWith = function(str, prefix) 
   return str.lastIndexOf(prefix, 0) == 0;
;

我想知道他们为什么选择lastIndexOf 而不是indexOf,因为:

    在某些情况下,indexOf 的速度是原来的两倍。 浏览器兼容性相同。

这不是微优化,我真的相信:

return str.indexOf(prefix) == 0;

比:更简单、更干净并且碰巧更快:

return str.lastIndexOf(prefix, 0) == 0;

lastIndexOf 在这种情况下如何更好?

【问题讨论】:

lastIndexOf 应该理论上更快。 some quick testing 表明 lastIndexOf() 实际上比 indexOf() 慢 96% @SheshankS。 1. 这不是我的问题 2. 在将某些内容标记为重复之前,不仅要阅读问题标题,还要阅读其内容。 @SheshankS。可能,但仅仅因为标题共享很少的单词并不意味着问题是重复的。随意建议一个更好的标题。 您可能想看看这里:***.com/questions/646628/…,以及它下面的解决方案(以及第二个答案)。话虽如此,当您问“我想知道他们为什么选择...” 时,您的问题自动基于意见,因为这是该团队的选择。但是,如果您询问性能差异,我相信我链接的问题是一个很好的重复目标(因为我提到的两个答案)。 【参考方案1】:

MeasureThat 非常适合这类问题,我在这里为您创建了一个,可能会帮助您回答问题:

https://www.measurethat.net/Benchmarks/Show/3384/0/index-vs-lastindexof

据此, indexOf 只是快一点。当然,这取决于您要索引的内容。

IndexOf 查找第一次出现,lastIndexOf 返回最后一次出现。总而言之,它们现在的功能要好得多,比如地图。

老实说,如果 Google 使用它可能是有充分理由的。

【讨论】:

这甚至不能回答问题。 "据此,indexOf 只是快一点。" --- 据此,它表明基准执行得很差,并且被 vm 优化了。 Erm,它有点“在某些情况下 indexOf 的速度是原来的两倍。”,这表明它不是大声笑。我的意思是,最重要的是,这两者是不同的功能。 "呃,它有点像'indexOf 在某些情况下速度是原来的两倍。'" --- 它没有,这里后者快 100 倍,每秒 800M 操作,即表示优化:您的测试仅表明您无法快速运行。 这很有趣,我想你实际上得到了不同的结果,我在 Mac 上使用 Safari,Chrome 和 Safari 之间可能不同。顺便说一句,这不是我的,只是我知道的一个网站。

以上是关于在这种情况下,lastIndexOf() 如何比 indexOf() 好? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在这种特殊情况下,为啥 gccgo 比 gc 慢?

为啥向量总是比 C 数组慢,至少在这种情况下?

QuickSort 最佳情况比平均情况最差

使用刷新令牌和访问令牌如何比仅使用 1 个 JWT 更“安全”?

插入排序比冒泡排序好?

如何使用包含比函数参数更多的项目的字典调用函数?