Sprawdzone metody

W tym dokumencie opisujemy sprawdzone metody, które pomogą Ci poprawić wydajność skryptów.

Minimalizuj wywołania innych usług

Operacje JavaScript w skrypcie są znacznie szybsze niż wywoływanie innych usług. Wszystko, co można osiągnąć za pomocą samego skryptu Google Apps Script, będzie znacznie szybsze niż wykonywanie połączeń wymagających pobierania danych z serwerów Google lub serwera zewnętrznego, na przykład żądań przesyłanych do Arkuszy, Dokumentów, Witryn, Tłumacza, UrlFetch. Skrypty będą działać szybciej, jeśli uda Ci się znaleźć sposoby na zminimalizowanie wywołań wykonywanych przez skrypty do tych usług.

Rozważ współpracę przy użyciu dysków współdzielonych

Jeśli pracujesz nad projektem skryptu z innymi programistami, możesz współpracować nad projektami Apps Script przy użyciu dysków współdzielonych. Pliki na dysku współdzielonym są własnością grupy, a nie poszczególnych osób. Ułatwia to tworzenie i utrzymywanie projektu.

Używanie operacji wsadowych

Skrypty zwykle muszą odczytywać dane z arkusza kalkulacyjnego, wykonywać obliczenia, a potem zapisywać wyniki w arkuszu kalkulacyjnym. Skrypt Google Apps ma już wbudowaną optymalizację, np. korzysta z buforowania z wyprzedzeniem do pobierania tego, co skrypt może uzyskać, oraz do zapisu w buforowaniu, aby zapisać to, co prawdopodobnie zostanie ustawione.

Możesz pisać skrypty, aby w pełni wykorzystać wbudowane buforowanie, minimalizując liczbę odczytów i zapisów. Naprzemienne polecenia odczytu i zapisu działają wolno. Aby przyspieszyć skrypt, odczytaj wszystkie dane do tablicy jednym poleceniem, wykonaj dowolne operacje na danych w tablicy i zapisz dane za pomocą jednego polecenia.

Oto przykład – nie należy postępować zgodnie z nim. Skrypt używa podanego niżej kodu, aby ustawić kolory tła każdej komórki w siatce arkusza kalkulacyjnego o wymiarach 100 x 100. Używa ona funkcji o nazwie getColorFromCoordinates() (nie pokazano tutaj), aby określić kolor każdej komórki:

  // DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
  // FOR DEMONSTRATION ONLY
  var cell = sheet.getRange('a1');
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    for (var x = 0; x < 100; x++) {
      var c = getColorFromCoordinates(xcoord, ycoord);
      cell.offset(y, x).setBackgroundColor(c);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
    SpreadsheetApp.flush();
  }

Skrypt jest niewydajny: wykonuje zapętlenie 100 wierszy i 100 kolumn, zapisując po kolei do 10 000 komórek. Jest to pomocne, bo wymusza odczyt zwrotny za pomocą funkcji flush na końcu każdego wiersza. Ze względu na buforowanie istnieje tylko 100 wywołań.

Wydajność kodu można jednak znacznie zwiększyć, grupując wywołania. W tym przykładzie zakres komórek jest odczytywany w tablicy o nazwie kolory, operacja przypisywania kolorów jest wykonywana na danych w tablicy, a wartości z tablicy są zapisywane w arkuszu kalkulacyjnym:

  // OKAY TO USE THIS EXAMPLE or code based on it.
  var cell = sheet.getRange('a1');
  var colors = new Array(100);
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    colors[y] = new Array(100);
    for (var x = 0; x < 100; x++) {
      colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
  }
  sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors);

Niewydajny kod uruchamia się po około 70 sekundach. Sprawny kod działa już w sekundę.

Unikaj bibliotek w skryptach, które generują duży nacisk na interfejs użytkownika

Biblioteki to wygodny sposób na ponowne wykorzystanie kodu, ale nieco wydłużają czas uruchamiania skryptu. Opóźnienie to nie jest zauważalne w przypadku stosunkowo długo działających skryptów (np. skryptu narzędziowego do czyszczenia plików na Dysku Google), ale w przypadku interfejsów usługi HTML po stronie klienta, które wykonują powtarzane, krótkie wywołania google.script.run, będą miały wpływ na każde wywołanie. Z tego powodu biblioteki należy oszczędnie używać w dodatkach i lepiej unikać ich w skryptach, które nie są dodatkami, które generują wiele wywołań google.script.run.

Korzystanie z usługi Cache

Za pomocą usługi pamięci podręcznej możesz buforować zasoby pomiędzy wykonaniami skryptów. Dzięki buforowaniu możesz zmniejszyć liczbę prób i częstotliwości pobierania danych. Rozważmy scenariusz, w którym masz na stronie example.com kanał RSS, którego pobranie zajmuje 20 sekund, i chcesz przyspieszyć dostęp do przeciętnego żądania. Poniższy przykład pokazuje, jak przyspieszyć dostęp do tych danych za pomocą usługi Cache.

  function getRssFeed() {
    var cache = CacheService.getScriptCache();
    var cached = cache.get("rss-feed-contents");
    if (cached != null) {
      return cached;
    }
    // This fetch takes 20 seconds:
    var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
    var contents = result.getContentText();
    cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
    return contents;
  }

Teraz, mimo że musisz jeszcze poczekać 20 sekund, jeśli elementu nie ma w pamięci podręcznej, kolejny dostęp będzie bardzo szybki, aż do usunięcia go z pamięci podręcznej po 25 minutach.