Friday, 18 June 2021

google docs apps script function calling very slow

I'm writing a google docs apps script in making a google docs add-on. When the user clicks a button in the sidebar, an apps script function is called named executeSpellChecking. This apps script function makes a remote POST call after getting the document's text.

total time to complete = time that takes from when user clicks the button, until the .withSuccessHandler(, that means until executeSpellChecking returns = 1.9 seconds

total function time = time that takes for the executeSpellChecking call to complete from its start to its end = 1.2 seconds

t3 = time that takes for the remote POST call to be completed = 600ms

t4 = time that takes for the same remote POST call to complete in a VB.NET app = 200ms

Problems:

Why total time to complete is bigger than total function time by a staggering 700ms, what else happens there? shouldn't they be equal? How can I improve it?

Why t3 is bigger than t4 ? Shouldn't they be equal? Is there something wrong with POST requests when happening from .gs? How can I improve it ?

the code is (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();
    google.script.run
        .withSuccessHandler(
          function(textAndTranslation, element) {
            if (gb_IsSpellCheckingEnabled) {
              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);
  }

and the called function code is (spellcheck.gs):

function executeSpellChecking(origin, dest, savePrefs) {
  var t1 = new Date().getTime();
  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();
  var response = UrlFetchApp.fetch(url, options);
  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();
  return {
    "time" : "total function time: " + (t2-t1) + "###POST request time:" + (t22-t11),
    "pagewords" : pagewords,
    "pagewordsOrig" : pagewordsOrig,
    "pagewordsOrigOffset" : pagewordsOrigOffset,
    "spellchecked" : spellchecked
  }
}

alert result: total time to complete:1902###total function time: 1190###POST request time:614

Thank you in advance for any help.



from google docs apps script function calling very slow

No comments:

Post a Comment