【问题标题】:Fastest way to check if substring is at specific position of another string检查子字符串是否位于另一个字符串的特定位置的最快方法
【发布时间】:2016-11-29 03:55:47
【问题描述】:

我有字符串(长度 50-2000)和潜在子字符串(长度 2-8),它们只能从特定位置开始(它可能发生在其他地方,但我不在乎)。我需要测试大量的字符串,所以速度是这里的关键。那么有没有更快的方法:

var q = baseString.indexOf(searchString, assumedIndex) === assumedIndex; 

var q = baseString.substr(assumedIndex, searchString.length) === searchString; 

【问题讨论】:

  • 您有性能问题吗?
  • 我的猜测是第二个要快得多,因为它有运行时 O(m),其中 m 是搜索字符串的长度,而第一个有 O(n),其中 n 是基本字符串的长度。并且m小于n。尽管这是假设 indexOf 的简单实现。这些数字也没有那么大,所以大的 O 表示法不是真正有效的
  • @JosephYoung 没有更多细节,你的 猜测 就是这样,一个猜测,它并不比任何其他猜测好多少(如果你知道字符串有 97% 的机会立即匹配吗??)
  • 暂时没有,它还没有投入生产。它适用于 10k-500k 的检查,最坏的情况是需要第二次左右(快速的机器,合成数据 - 与实际相比,浏览器可能以错误的方式优化)。但是如果我添加更多类似的 indexOf/substr,我可以改善它的行为。这会减慢它的速度。所以我正在寻找改进它。
  • @Amit 好吧,是的,但正如我所说,我使用的是大 O 表示法,所以为了争论,这是假设最坏的情况。我在评论中写了它,因为我没有确切的答案

标签: javascript string performance


【解决方案1】:

记住 Amit 在 cmets 中所说的话,我想我不妨添加一个(可能)比至少 substr 方法更快的替代方法:

var q = baseString.startsWith(searchString, assumedIndex); 

来自MDN

startsWith() 方法确定字符串是否以 另一个字符串的字符,根据需要返回 truefalse

小例子:

> "Hello world!".startsWith("world!",6)
< true

我认为它可能更快的原因是因为 polyfill(如下所示)是您使用 substr 直接实现的,除了浏览器实现将在本机实现并且可能没有字符串复制。所以它应该至少和你已经建议的一样快。

Polyfill:

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position){
      position = position || 0;
      return this.substr(position, searchString.length) === searchString;
  };
}

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多