簡體   English   中英

谷歌文檔應用程序腳本 function 調用非常慢

[英]google docs apps script function calling very slow

我正在編寫一個谷歌文檔應用程序腳本來制作谷歌文檔插件。 當用戶點擊側邊欄中的按鈕時,應用程序腳本 function 被稱為executeSpellChecking 此應用程序腳本 function 在獲取文檔文本后進行遠程 POST 調用。

total time = 從用戶單擊按鈕到.withSuccessHandler(所用的時間,這意味着直到executeSpellChecking返回 = 2000 ms

function time = executeSpellChecking調用從開始到結束所用的時間 = 1400 ms

t3 = 完成遠程 POST 調用所需的時間 = 800ms

t4 = 在 VB.NET 應用程序中完成相同的遠程 POST 調用所需的時間 = 200 毫秒

問題:

為什么total time to completetotal function time的總時間大了驚人的 600 毫秒,還會發生什么? 他們不應該是平等的嗎? 我該如何改進它?

為什么t3大於t4 他們不應該是平等的嗎? 從.gs 發生時,POST 請求有問題嗎? 我該如何改進它?

代碼是(sidebar.html):

  function runSpellChecking() {
    gb_IsSpellcheckingRunning = true;
    //gb_isAutoCorrecting = false;
    gi_CorrectionCurrWordIndex = -1;
    $("#btnStartCorr").attr("disabled", true);

    $("#divMistakes").html("");
    this.disabled = true;
    //$('#error').remove();
    var origin = $('input[name=origin]:checked').val();
    var dest = $('input[name=dest]:checked').val();
    var savePrefs = $('#save-prefs').is(':checked');
    //var t1 = new Date().getTime();
    console.time("total time");
    google.script.run
        .withSuccessHandler(
          function(textAndTranslation, element) {
            if (gb_IsSpellCheckingEnabled) {
              console.timeEnd("total time");
              //var t2 = new Date().getTime();
              go_TextAndTranslation = JSON.parse(JSON.stringify(textAndTranslation));
              var pagewords = textAndTranslation.pagewords;
              var spellchecked = textAndTranslation.spellchecked;
              //alert("total time to complete:" + (t2-t1) + "###" + go_TextAndTranslation.time);
              //irrelevant code follows below...
            }
          })
        .withFailureHandler(
          function(msg, element) {
            showError(msg, $('#button-bar'));
            element.disabled = false;
          })
        .withUserObject(this)
        .executeSpellChecking(origin, dest, savePrefs);
  }

並且調用的 function 代碼是(spellcheck.gs):

function executeSpellChecking(origin, dest, savePrefs) {
  //var t1 = new Date().getTime();
  console.time("function time");
  var body = DocumentApp.getActiveDocument().getBody();
  var alltext = body.getText();
  var lastchar = alltext.slice(-1);
  if (lastchar != " " && lastchar != "\n") {
    body.editAsText().insertText(alltext.length, "\n");
    alltext = body.getText();
  }

  var arr_alltext = alltext.split(/[\s\n]/);
  var pagewords = new Object;
  var pagewordsOrig = new Object;
  var pagewordsOrigOffset = new Object;
  var offset = 0;
  var curWord = "";
  var cnt = 0;
  
  for (var i = 0; i < arr_alltext.length; i++) {
    curWord = arr_alltext[i];
    if (StringHasSimeioStiksis(curWord)) {
      curWord = replaceSimeiaStiksis(curWord);
      var arr3 = curWord.split(" ");
      for (var k = 0; k < arr3.length; k++) {
        curWord = arr3[k];
        pagewords["" + (cnt+1).toString()] = curWord.replace(/[`~@#$%^&*()_|+\-="<>\{\}\[\]\\\/]/gi, '');
        pagewordsOrig["" + (cnt+1).toString()] = curWord;
        pagewordsOrigOffset["" + (cnt+1).toString()] = offset;
        offset += curWord.length;
        cnt++;
      }
      offset++;
    } else {
      pagewords["" + (cnt+1).toString()] = curWord.replace(/[`~@#$%^&*()_|+\-="<>\{\}\[\]\\\/\n]/gi, '');
      pagewordsOrig["" + (cnt+1).toString()] = curWord;
      pagewordsOrigOffset["" + (cnt+1).toString()] = offset;
      offset += curWord.length + 1;
      cnt++;
    }
  }

  var respTString = "";

  var url = 'https://www.example.org/spellchecker.php';
  var data = {
    "Text" : JSON.stringify(pagewords),
    "idOffset" : "0",
    "lexID" : "8",
    "userEmail" : "test@example.org"
  };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  //var t11 = new Date().getTime();
  console.time("POST time");
  var response = UrlFetchApp.fetch(url, options);
  console.timeEnd("POST time");
  //var t22 = new Date().getTime();
  var resp = response.getContentText();
  respTString = resp;
  var spellchecked = JSON.parse(respTString);

  var style = {};
  for (var k in pagewords){
      if (pagewords.hasOwnProperty(k)) {
          if (spellchecked.hasOwnProperty(k)) {
            if (spellchecked[k].substr(0, 1) == "1") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#000000";
            }            
            if (spellchecked[k].substr(0, 1) == "0") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#FF0000";
            }
            if (spellchecked[k].substr(0, 1) == "4") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#0000FF";
            }
            if (pagewordsOrigOffset[k] < alltext.length) {
              body.editAsText().setAttributes(pagewordsOrigOffset[k], pagewordsOrigOffset[k] + pagewordsOrig[k].length, style);
            }
          }
      }
  }

  //var t2 = new Date().getTime();
  console.timeEnd("function time")
  return {
    "pagewords" : pagewords,
    "pagewordsOrig" : pagewordsOrig,
    "pagewordsOrigOffset" : pagewordsOrigOffset,
    "spellchecked" : spellchecked
  }
}

預先感謝您的任何幫助。

編輯:我根據建議更新了代碼以使用 console.time ,結果是:

total time: 2048.001953125 ms
Jun 21, 2021, 3:01:40 PM    Debug   POST time: 809ms
Jun 21, 2021, 3:01:41 PM    Debug   function time: 1408ms

所以問題不在於如何測量時間。 function 時間為 1400ms,而返回時間為 2000ms,相差 600ms,POST 時間更是驚人的 800ms,而不是在 VB.net 中進行完全相同的 POST 調用所需的 200ms。

使用 console.time() 和 console.timeEnd(): https://developers.google.com/apps-script/reference/base/console

我為你修改了代碼。 console.timeEnd() 會自動在控制台中輸出持續時間,因此我為您刪除了顯示時差的警報。

您可能希望我用作參數的字符串作為某種常量變量,因此沒有使用兩次的魔術字符串。 我希望這對你有用。

function runSpellChecking() {
    gb_IsSpellcheckingRunning = true;
    //gb_isAutoCorrecting = false;
    gi_CorrectionCurrWordIndex = -1;
    $("#btnStartCorr").attr("disabled", true);

    $("#divMistakes").html("");
    this.disabled = true;
    //$('#error').remove();
    var origin = $('input[name=origin]:checked').val();
    var dest = $('input[name=dest]:checked').val();
    var savePrefs = $('#save-prefs').is(':checked');
    console.time("total time");
    google.script.run
        .withSuccessHandler(
          function(textAndTranslation, element) {
            if (gb_IsSpellCheckingEnabled) {
              console.timeEnd("total time");
              go_TextAndTranslation = JSON.parse(JSON.stringify(textAndTranslation));
              var pagewords = textAndTranslation.pagewords;
              var spellchecked = textAndTranslation.spellchecked;
              //irrelevant code follows below...
            }
          })
        .withFailureHandler(
          function(msg, element) {
            showError(msg, $('#button-bar'));
            element.disabled = false;
          })
        .withUserObject(this)
        .executeSpellChecking(origin, dest, savePrefs);
}

function executeSpellChecking(origin, dest, savePrefs) {
  console.time("function time");
  var body = DocumentApp.getActiveDocument().getBody();
  var alltext = body.getText();
  var lastchar = alltext.slice(-1);
  if (lastchar != " " && lastchar != "\n") {
    body.editAsText().insertText(alltext.length, "\n");
    alltext = body.getText();
  }

  var arr_alltext = alltext.split(/[\s\n]/);
  var pagewords = new Object;
  var pagewordsOrig = new Object;
  var pagewordsOrigOffset = new Object;
  var offset = 0;
  var curWord = "";
  var cnt = 0;
  
  for (var i = 0; i < arr_alltext.length; i++) {
    curWord = arr_alltext[i];
    if (StringHasSimeioStiksis(curWord)) {
      curWord = replaceSimeiaStiksis(curWord);
      var arr3 = curWord.split(" ");
      for (var k = 0; k < arr3.length; k++) {
        curWord = arr3[k];
        pagewords["" + (cnt+1).toString()] = curWord.replace(/[`~@#$%^&*()_|+\-="<>\{\}\[\]\\\/]/gi, '');
        pagewordsOrig["" + (cnt+1).toString()] = curWord;
        pagewordsOrigOffset["" + (cnt+1).toString()] = offset;
        offset += curWord.length;
        cnt++;
      }
      offset++;
    } else {
      pagewords["" + (cnt+1).toString()] = curWord.replace(/[`~@#$%^&*()_|+\-="<>\{\}\[\]\\\/\n]/gi, '');
      pagewordsOrig["" + (cnt+1).toString()] = curWord;
      pagewordsOrigOffset["" + (cnt+1).toString()] = offset;
      offset += curWord.length + 1;
      cnt++;
    }
  }

  var respTString = "";

  var url = 'https://www.example.org/spellchecker.php';
  var data = {
    "Text" : JSON.stringify(pagewords),
    "idOffset" : "0",
    "lexID" : "8",
    "userEmail" : "test@example.org"
  };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  console.time("POST time");
  var response = UrlFetchApp.fetch(url, options);
  console.timeEnd("POST time");
  var resp = response.getContentText();
  respTString = resp;
  var spellchecked = JSON.parse(respTString);

  var style = {};
  for (var k in pagewords){
      if (pagewords.hasOwnProperty(k)) {
          if (spellchecked.hasOwnProperty(k)) {
            if (spellchecked[k].substr(0, 1) == "1") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#000000";
            }            
            if (spellchecked[k].substr(0, 1) == "0") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#FF0000";
            }
            if (spellchecked[k].substr(0, 1) == "4") {
              style[DocumentApp.Attribute.FOREGROUND_COLOR] = "#0000FF";
            }
            if (pagewordsOrigOffset[k] < alltext.length) {
              body.editAsText().setAttributes(pagewordsOrigOffset[k], pagewordsOrigOffset[k] + pagewordsOrig[k].length, style);
            }
          }
      }
  }

  console.timeEnd("function time");
  return {
    "pagewords" : pagewords,
    "pagewordsOrig" : pagewordsOrig,
    "pagewordsOrigOffset" : pagewordsOrigOffset,
    "spellchecked" : spellchecked
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM