Ten dokument zawiera listę sprawdzonych metod, które pomogą Ci poprawić wydajność skryptów.
Minimalizowanie połączeń z innymi usługami
Wykonywanie operacji JavaScript w ramach skryptu jest znacznie szybsze niż wywoływanie innych usług. Wszystko, co możesz wykonać w ramach Google Apps Script, będzie znacznie szybsze niż wywoływanie funkcji, które wymagają pobierania danych z serwerów Google lub serwerów zewnętrznych, takich jak prośby o wykonanie zadań w Arkuszach, Dokumentach, Witrynach, Tłumaczu czy UrlFetch itp. 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ółtworzyć projekty Apps Script na udostępnionych dyskach. Pliki na dysku współdzielonym należą do grupy, a nie do poszczególnych użytkowników. Ułatwia to tworzenie i utrzymanie projektu.
Korzystanie z operacji zbiorczych
Skrypty często muszą odczytywać dane z arkusza kalkulacyjnego, wykonywać obliczenia, a następnie zapisywać wyniki w arkuszu kalkulacyjnym. Google Apps Script zawiera już wbudowaną optymalizację, na przykład korzystanie z pamięci podręcznej z wyprzedzeniem do pobierania danych, które skrypt prawdopodobnie uzyska, oraz z pamięci podręcznej do zapisu danych, które prawdopodobnie zostaną 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 funkcji o nazwie getColorFromCoordinates()
(nie pokazanej tutaj), aby określić, jakiego koloru użyć w przypadku 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 przypisania 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. Wydajny kod działa w zaledwie 1 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. To opóźnienie nie jest zauważalne w przypadku stosunkowo długich skryptów (np. skryptu narzędziowego do czyszczenia plików na Dysku Google), ale w przypadku interfejsów użytkownika usługi HTML po stronie klienta, które wykonują powtarzające się, krótkie google.script.run
wywołania, opóźnienie będzie dotyczyć każdego wywołania. 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
Do przechowywania zasobów w pamięci podręcznej między wykonaniami skryptu możesz użyć usługi pamięci podręcznej. Dzięki przechowywaniu danych w pamięci podręcznej 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;
}
Nadal musisz czekać 20 sekund, jeśli element nie znajduje się w pamięci podręcznej, ale kolejne dostępy będą bardzo szybkie, dopóki element nie wygaśnie i nie zostanie usunięty z pamięci podręcznej po 25 minutach.