Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl


pp-layouts
Napisane: 12.01.2010, 03:21:06





Grupa: Zarejestrowani
Postów: 53
Dołączył: 28.09.2007
Skąd: Gdynia

Ostrzeżenie: (0%)
-----

Specjalnie dla Ciebie, wielki test:

[JAVASCRIPT] pobierz, plaintext
  1. function ms() {
  2. var d = new Date();
  3. return d.getTime();
  4. }
  5.  
  6. function benchmark(fn, iterations) {
  7. var time = ms();
  8. for (var i = 0; i < iterations; i++) fn();
  9. return ms() - time;
  10. }
  11.  
  12. function A(x) {
  13. this.y = x;
  14. this.t = function() {
  15. return this.y++;
  16. };
  17. };
  18.  
  19. B = function(x) {
  20. this.y = x;
  21. this.t = function() {
  22. return this.y++;
  23. };
  24. };
  25.  
  26. C = function(x) {
  27. return {
  28. y : x,
  29. t : function() {
  30. return this.y++;
  31. }
  32. };
  33. };
  34.  
  35. D = function(x) { this.y = x; };
  36. D.prototype = {
  37. y : null,
  38. t : function() {
  39. return this.y++;
  40. }
  41. };
  42.  
  43. iterations = 1000000;
  44.  
  45. td = benchmark(function() { d = new D(3); d.t(); }, iterations);
  46. tc = benchmark(function() { c = new C(2); c.t(); }, iterations);
  47. tb = benchmark(function() { b = new B(1); b.t(); }, iterations);
  48. ta = benchmark(function() { a = new A(0); a.t(); }, iterations);
  49.  
  50. alert("Wyniki: " + [ta, tb, tc, td].join(', ') + 'ms');
  51. alert("Sprawdzenie: " + [a.y, b.y, c.y, d.y].join(', '));
[JAVASCRIPT] pobierz, plaintext



Oto wyniki:

Firefox 3.6 beta 5: 5054, 6622, 5887, 2726 ms

Opera 10.10: 2102, 2079, 2925, 1381 ms

Chrome 4.0.249.43: 310, 302, 369, 75 ms

IE 8: 8085, 8315, 10457, 6007 ms

Są to średnie z 3 testów dla wszystkich przeglądarek z wyjątkiem IE, nie chciało mi się tyle czekać.

Zdecydowanym faworytem jest klasa utworzona z prototypu, czyli nasze D. Rozwiązanie z funkcją zwracającą obiekt © nie sprawdza się za dobrze w większości przeglądarek. Rozwiązania z funkcją i nieszczęsnym this-em (A i cool.gif uzyskują podobny średni wynik, z przewagami zależnymi od przeglądarki.

Pewnie za wcześnie na poważne wnioski, ale ten banalny test wykazuje pewną wyższość konstrukcji z prototypem. Test sprawdza specyficzną rzecz - mianowicie szybkość tworzenia, inicjowania i użycia egzemplarza klasy. Innym razem trzeba sprawdzić jak będą kształtowały się profile wydajności w przypadku iteracji samego użycia egzemplarza, bez jego tworzenia. Sytuacja tworzenia egzemplarza w każdej iteracji jest raczej nietypowa - przez co niezbyt miarodajna.

Żeby zakończyć ten odcinek jakimś morałem - wydaje mi się, że ogólny wniosek płynący z tego doświadczenia - 1 ch. smile.gif Są pewne różnice w wydajności, ale generalnie jeśli nie liczymy taktów procka jak w demie na C64 - style klas zostaną chyba w całości w kwestii upodobań danego programisty.

PS, mały update, sprawdziłem jeszcze

[JAVASCRIPT] pobierz, plaintext
  1. E = function(x) { this.y = x; };
  2. E.prototype.y = null;
  3. E.prototype.t = function() {
  4. return this.y++;
  5. }
[JAVASCRIPT] pobierz, plaintext



Uzyskuje nieznacznie gorsze wyniki od D we wszystkich przeglądarkach z wyjątkiem FF, gdzie wychodzi odrobinę szybciej, ale może to być mimo wszystko błąd pomiaru.

Myślę sobie, że silniki JS chyba optymizują jakoś definicje via prototype. Ja więc zostaję przy nich, z ulubionym stylem Class.prototype = JSON. smile.gif

  Forum: JavaScript · Podgląd postu: #700564 · Odpowiedzi: 2 · Wyświetleń: 884


New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 14:08