Przejdź do zawartości

Wikipedia:Szybkość Lua

Z Wikipedii, wolnej encyklopedii

Ten esej wyjaśnia różne kwestie dotyczące szybkości i wydajności wykonywania skryptów Lua w Wikipedii. Szybkość wykonywania modułów Lua może się różnić znacząco od podobnych skryptów w postaci szablonów wiki, często nawet 4–8 razy szybciej, 180 000 razy szybciej przy skanowaniu łańcuchów tekstu, które mogą przekraczać limit 500 znaków, który występuje w przypadku funkcji parsera – w przypadku modułów może to być 64 000 znaków lub nawet więcej. Na określoną wydajność Lua duży wpływ ma liczba używanych parametrów oraz jak „głęboko” działa zagnieżdżona logika. Także techniki optymalizacyjne mogą zostać wykorzystane aby umożliwić modułom jeszcze szybsze działanie.

Dla bardzo krótkich operacji, uruchomienie szybkiej funkcji Lua w lutym 2013 było taktowane zegarem 300 na sekundę, ograniczone prędkością interfejsu #invoke rozszerzenia Scribunto. Jednak w marcu 2013, ogłoszono plany podwojenia prędkości funkcji #invoke, pozwalając funkcjom Lua na ich wykonywanie z prędkością 600/sekundę ({{#invoke:String|len}} – 625/sekundę). Prędkość jest również ogarniczana przez przenoszenie parametrów liczbowych, ponad 400, gdzie prędkość spada wykładniczo – nie jest to już maleńki ułamek sekundy. Przeniesienie 2000 parametrów zajmuje 3 sekundy, 4000 parametrów – 13 sekund, a 6000 – 27 sekund. Spowolnienie opóźnienia czasowego jest takie samo w przypadku przenoszenia parametrów z funkcją #invoke, do szablonu, czy do funkcji parsera, takiej jak #switch z tysiącami gałęzi „|x=”.

Przeprowadzone w angielskiej Wikipedii liczne testy szablonów cytowania opartych na Lua, takich jak {{Cite journal}}, każdy przetwarzający ponad 230 możliwych nazw parametrów, taktowane są 6–13x szybciej przy formatowaniu 80–200 szablonów cytowania na sekundę. Przy formatowaniu prostych parametrów Lua okazuje się być nawet ~25x szybsza niż wikikod. Tymczasem, testy skanów łańcuchów, przeprowadzane z wykorzystaniem Lua, lub nawet wydobywanie końcowego znaku z użyciem funkcji „string.sub(mytext,-1,-1)” może pracować tysiące razy szybciej niż analogiczne rozwiązanie w wikikodzie; poza tym z użyciem Lua można przekroczyć znacznie limit 500 znaków w łańcuchu, który jest narzucany przez wikikod, wyszukując całe sekcje wikitekstu liczące nawet ponad 64 000 znaków.

Kiedy prędkość jest krytyczna, wywołanie małej funkcji Lua bezpośrednio w kodzie strony może być 50% szybsze niż użycie powiązanego szablonu. I tak, patrząc na rozwiązania w angielskiej Wikipedii:

  • oparty na Lua szablon, {{Str len}}, pracuje z prędkością ~400/sek.
  • funkcja Lua, {{#invoke|Moduł:String|len|...}}, pracuje z prędkością ~625/sek.

50% szybciej jest użyć {{#invoke:String|len|s=xxyyzz}} aby wywołać krótką funkcję „len” w module String. Takie rozwiązanie zmniejsza także głębkokość rozwinięcia z trzech poziomów do dwóch.

Niektóre informacje liczbowe dotyczące prędkości:

  • wiele funkcji parsera pracuje z prędkością ~1250 na sekundę (takie funkcje, jak: {{#if}} {{#ifeq}} {{#ifexpr}});
  • krótkie szablony pracują z wydajnością setek rozwinięć na sekundę;
  • szablony zastępujące znaki mogą pracować z prędkością ~2400 rozwinięć na sekundę, np. {{!!}};
  • infoboksy umieszczone u góry artykułów mogą formatować się w przeciągu ~1-2 sekund;
  • navboksy u dołu stron formatują się w przeciągu 2–3 szablonów na sekundę;
  • oparte na wikikodzie szablony cytowania pracują z wydajnością 14 rozwinięć na sekundę;
  • Szablon:Konwerter pracuje z wydajnością 30 wywołań na sekundę, pomimo setek możliwych kodów jednostkowych.

W rzeczywistości, w angielskiej Wikipedii {{Konwerter}} (ang. {{Convert}}) był ciekawym przypadkiem, z głównym problemem dotyczącym limitu głębokości ekspansji, a nie prędkością, ponieważ artykuły miały często mniej niż 7 konwersji (ułamek sekundy na rozwinięcie), ale głębokość rozwinięcia tego szablonu sięgała nawet poziomów 19–29. Stąd, umieszczony w podwójnie zagnieżdżonych infoboksach, {{Konwerter}} często przekraczał limit głębokości rozwinięcia. W przypadku szablonów korzystających z modułów Lua, głębokość rozwinięcia zazwyczaj jest na 3. poziomie.