慢速自定义脚本GAS

时间:2020-05-26 14:25:30

标签: javascript performance google-apps-script google-sheets custom-function

因此,我编写了(由于缺乏答案+提高我的技能)搜索脚本,基本上可以完成.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倍。

为什么会有这种差异?

1 个答案:

答案 0 :(得分:1)

问题:

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

这效率极低,可以大大简化,因此,毫无疑问,此功能比String.prototype.indexOf()慢得多。

解决方案:

相反,您可以有一个循环,循环遍历ref,对于每次迭代,在比较之前,检索data的{​​{1}},其长度与data相同带有ref的切片。如果两个值都匹配,则在ref中找到字符串ref,并返回相应的索引:

data

使用此功能时,执行时间与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; } 相似。

参考: