Ten dokument zawiera listę sprawdzonych metod, które pomogą Ci poprawić wydajność skryptów.
Minimalizowanie połączeń z innymi usługami
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. Jeśli uda Ci się znaleźć sposób na zminimalizowanie wywołań skryptów do tych usług, będą one działać szybciej.
Zastanów się nad współpracą na dyskach 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 utrzymanie projektu.
Korzystanie z operacji zbiorczych
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 maksymalny sposób korzystać z wbudowanego buforowania, minimalizując liczbę operacji odczytu i zapisu. Przełączanie się między poleceniami odczytu i zapisu jest powolne. Aby przyspieszyć skrypt, odczytaj wszystkie dane do tablicy za pomocą jednego polecenia, wykonaj dowolne operacje na danych w tabeli i zapisz dane za pomocą jednego polecenia.
Oto przykład, którego nie należy stosować. Skrypt używa tego kodu do ustawiania kolorów tła każdej komórki w siatce arkusza kalkulacyjnego 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 nieefektywny: przechodzi przez 100 wierszy i 100 kolumn, zapisując kolejno 10 tysięcy komórek. Pamięć podręczna Google Apps Script ułatwia odświeżanie, ponieważ wymusza odświeżanie za pomocą opcji flush na końcu każdego wiersza. Z powodu buforowania jest tylko 100 wywołań arkusza kalkulacyjnego.
Jednak kod może być znacznie wydajniejszy, jeśli wywołania zostaną zgrupowane. Oto nowa wersja kodu, w której zakres komórek jest odczytywany do tablicy o nazwie colors, operacja przypisywania koloru jest wykonywana na danych w tabeli, a wartości w tabeli 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).setBackgrounds(colors);
Nieefektywny kod wykonuje się przez około 70 sekund. Sprawny kod działa już w sekundę.
Unikaj bibliotek w skryptach zawierających dużo kodu związanego z interfejsem użytkownika
Biblioteki to wygodny sposób na ponowne użycie kodu, ale nieznacznie 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ą powtarzalne, krótkie wywołania google.script.run
, będą miały wpływ na każde wywołanie. Z tego powodu biblioteki powinny być używane oszczędnie w dodatkach, a w skryptach innych niż dodatki, które wykonują dużo wywołań google.script.run
, lepiej ich unikać.
Korzystanie z usługi tymczasowego przechowywania danych
Możesz użyć usługi pamięci podręcznej, aby przechowywać zasoby w pamięci podręcznej między wykonaniami skryptu. Dzięki buforowaniu danych możesz zmniejszyć liczbę lub częstotliwość pobierania danych. Wyobraź sobie, że masz plik danych RSS na stronie example.com, którego pobieranie zajmuje 20 sekund, i chcesz przyspieszyć dostęp do średniej ilości żądań. Przykład poniżej pokazuje, jak za pomocą usługi Cache Service przyspieszyć dostęp do tych danych.
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.