为了账号安全,请及时绑定邮箱和手机立即绑定

性能慢的自定义脚本 GAS

性能慢的自定义脚本 GAS

慕森王 2022-09-02 17:14:18
因此,我编写了(由于缺乏答案+提高我的技能)一个搜索脚本,该脚本基本上可以完成.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 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

问题:

您的函数是在内部循环中将每个字符分别与一个字符进行比较,将每个字符匹配推送到数组()内,并使用将数组转换回字符串(),然后再将其与原始数组进行比较。refdataprotojoinproto2ref


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


溶液:

您可以改为使用单个循环,循环访问 ,对于每次迭代,检索与 相同长度的切片,然后再将此切片与 进行比较。如果两个值匹配,则在 中找到字符串,并返回相应的索引:datadatarefrefrefdata


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


查看完整回答
反对 回复 2022-09-02
  • 1 回答
  • 0 关注
  • 43 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信