Wrzucam benchmark, moze komus sie przyda, jak juz jest taki to skasujcie.

Stale czy zmienne? Chcialem napisac lang system, ale postanowilem sprawdzic przed napisaniem co jest szybsze, zeby nie bylo placzu.
Wyniki uzyskalem uzywajac profilera XDebug i programu WinCacheGrind.

Testy byly powtarzane kilka razy, co prawda nie chcialo mi sie liczyc sredniego czasu, ale upewnilem sie ze absurdalny wynik
nie został spowodowany jakims bledem czy chociazby zmiennym obciazeniem procka (za kazdym razem wychodzi podobnie)

Mówiąc zmienne mam na myśli globalną tablice asocjacyjną, cos w stylu lang['komunikat_odebrano_plik']='odebrano plik';

Prędkośc tworzenia w sytuacji gdy nazwy są posortowane nazwa1, nazwa2, nazwa3...:
Stałe: Tworzenie funkcją define 2000 razy: 33ms
Zmienne: Zapis do tablicy asocjacyjnej 2000 razy: 4,0ms

Jak widać tablica asocjacyjna przy tworzeniu jest szybsza ok 9-10 razy.

Uwaga: gdy losowo dodawałem do indeksu liczbe z zakresu (1-4000) przed prawdziwym indeksem, aby zasymulowac dodawanie
nieposortowanych stałych tak jak to bedzie mialo miejsce w rzeczywistosci (dodanie stałych _komunikat_skryptu, _daj_pieniadze,
_zamknij_ryj jest wlasnie przykladem dodania nieposortowanych stałych: k>d, d<z), wydajnosc tablic asocjacyjnych spada w stosunku
do stałych
Prędkośc tworzenia w sytuacji gdy do nazwy dodaje losowo znak - przed cyfrą:
Stałe: Tworzenie funkcją define 2000 razy: 80ms
Zmienne: Zapis do tablicy asocjacyjnej 2000 razy: 42ms.

Różnica spadła do 2 razy... Tablice asocjacyjne spowolnily sie 10 razy w stosunku do posortowanego przypadku,
ale czas wykonania wynosi aż 80/40ms czyli używając tablic asocjacyjnych zaoszczędzamy aż 40ms.

Ta roznica nadal wynosi 2 razy, nawet jeśli utworzymy 20 tys wpisów (713/445 ms)

Podejrzewam ze tablice asocjacyjne są sortowane aby zapewnic wieksza predkosc odczytu (do posortowanych tablic mozna zastosowac alg. wyszukiwania binarnego lub interpolacyjnego ktory ma czas logarytmiczny a nie liniowy).
Do tablic pewnie tez cos takiego sie stosuje tylko tablica stałych jest globalna dla wszystkich stałych i z tego ma wiecej wpisow i jest znacznie wolniejsza (czas takiego sortowania przy dodaniu nowego itemu rosnie liniowo wraz z iloscia wpisow).

Prędkość odczytu:
Zrobiłem 2 testy, jeden dla funkcji constant, a drugi dla normalnego dostępu przez nazwe stałej np echo nazwa_stalej;
Stałe: Odczyt funkcją constant 2000 razy: 72ms
Zmienne: Odczyt z tablicy asocjacyjnej 2000 razy: 8,0ms

Znowu tablica asocjacyjna jest szybsza o około 9-10 razy

Drugi test: z uzyciem nazwy stałej
Stałe Odczyt za pomoca nazwy stałej 2000razy: 32ms
Zmienne odczyt tablicy asocjacyjnej 2000 razy: 10ms

Tutaj tablica asocjacyjna jest szybsza tylko 3 razy.

Wnioski
Stałe są sporo wolniejsze od zmiennych. Przy tworzeniu systemu języka ma to jakies znaczenie, w końcu może on sięgnąć 2000 wpisów i więcej, a odczytów w takim systemie będzie zawsze sporo mniej niż zapisów (trzeba utworzyc wszystkie stałe, a odczytamy tylko część z nich).

Niewątpliwie na korzyść stałych przemawia wygoda: np w pakiecie eclipse po najechaniu mychą na nazwe stałej wyświetli nam sie jej zawartosc, co moze pomoc w debugowaniu czy ogólnie zorientowaniu się w treści skryptu, no i nie trzeba pisac za kazdym razem global $lang gdy chcemy w jakiejs procedurze uzyc jezyka.

Na małej stronie znajdzie sie około 300 pozycji więc przeliczylem tez dla takiej ilosci:
tworzenie 300 stałych funkcja define: 16ms
tworzenie 300 indeksow w tablicy asocjacyjnej: 5,4ms

Odczytu nie sprawdzalem gdyz jest on pomijalny: przy kazdym wywolaniu skryptu utworze 300 stalych/zmiennych a odczytam tylko 20.

Ponieważ moja strona zawiera (jak zwrocilo mi wyszukiwanie) 1500 stringow, z czego polowe moge odrzucic bo to pewnie jakies stringi
sql albo sterujace czyms, a polowa to labele zawierajace napisy przeznaczone dla uzytkownika, mam roznice ok 20 ms w czasie generowania strony stałe/zmienne. Poniewaz moze mi jeszcze przybyc tych wpisów, ja chyba zdecyduje sie na tablice asocjacyjną zeby pozniej nie bylo placzu.

Kod benchmarka:
  1. <?php
  2. define('howmuch', 2000);
  3. function makeconst()
  4. {
  5. for ($count = 1; $count < howmuch; $count++)
  6. {
  7. $randValue = rand(0, 1);
  8. if ($randValue)
  9. {
  10. $finalCount = (4000-$count).$count;
  11. }
  12. define('const' . $finalCount,
  13. 'stała stała stała stała stała stała stała stała stała stała stała stała' . $count);
  14. }
  15. }
  16. function makevar()
  17. {
  18. global $lang;
  19. for ($count = 1; $count < howmuch; $count++)
  20. {
  21. $randValue = rand(0, 1);
  22. if ($randValue)
  23. {
  24. $finalCount = (4000-$count).$count;
  25. }
  26. $lang['var' . $finalCount] = 'zmienna zmienna zmienna zmienna zmienna zmienna zmienna zmienna zmienna '
  27. . $count;
  28. }
  29. }
  30. function readconst()
  31. {
  32. for ($count = 1; $count < howmuch; $count++)
  33. {
  34. /* Zakomentowac w celu sprawdzenia dostepu przez nazwe stałej */
  35. // echo constant('const200');
  36. /* Odkomentowac w celu sprawdzenia dostepu przez nazwe stałej */
  37. echo const200;
  38. }
  39. }
  40. function readvar()
  41. {
  42. global $lang;
  43. for ($count = 1; $count < howmuch; $count++)
  44. {
  45. echo $lang['var' . $count];
  46. }
  47. }
  48. function test()
  49. {
  50. makeconst();
  51. makevar();
  52. // readconst();
  53. // readvar();
  54. }
  55. test();
  56. ?>