性能缓慢的自定义脚本 GAS

Slow Performance Custom Script GAS

因此,我编写了一个搜索脚本(由于缺少答案 + 提高我的技能),基本上可以完成 .indexOf 的功能。

function search(ref, data) {

  var x
  var y
  var result = []

  if (data == '' || data == null) {
  } else {
    for (x = 0; x < data.length; x++) {
      if (data[x] == ref[0]) {                //achando match inicial
        var proto = [];
        for (y = 0; y < ref.length; y++) {
          if (data[x+y] == ref[y]) {          //gravando tentativas de match completo
          proto.push(data[x+y])
          }
        }
        var proto2 = proto.join('')
        if (proto2 == ref) {                   //testando match completo
            result.push(x)
        }
      }
    }
  }
  if (result == '' || result == null) {
  } else {
    return result[0]
  }
}

它在不需要太多循环的其他小代码和自定义函数中运行良好,但是当我编写更强大的脚本时,我发现我的代码比原生 .indeOf 慢大约 3000 倍。

为什么我会产生这样的差异?

问题:

您的函数正在将 ref 中的每个字符分别与 data 字符进行比较,在一个内部循环中,将每个字符匹配推入数组 (proto) 并使用 join 将数组转换回字符串 (proto2),然后再与原始 ref 进行比较。

这是非常低效的,可以大大简化,所以毫无疑问这个函数比 String.prototype.indexOf().

慢得多

解决方案:

您可以改为使用单个循环,遍历 data,并且对于每次迭代,检索长度与 ref 相同的 dataslice,在将此切片与 ref 进行比较之前。如果两个值都匹配,则在data中找到了字符串ref,并返回对应的索引:

function searchString(ref, data) {
  for (let i = 0; i <= data.length - ref.length; i++) {
    if (ref === data.slice(i, i + ref.length)) return i;
  }
  return -1;
}

使用此函数时,我得到的执行时间与 indexOf 相似。

参考: