亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

性能慢的自定義腳本 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 關注
  • 77 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號