I. Prolog.
Wczoraj i przedwczoraj w związku z powstaniem modułu php realizującego kod perla trwała dyskusja na temat obu języków, na LinuxNews, postanowiłem więc przeprowadzić krótke testy wydajności obu technologii.
II. Wstęp.
Jestem entuzjastą i programistą php, święte wojny interesują mnie mniej więcej tak jak przeciętnego czytelnika 7thguard. Coż można zaliczyć do fanatyzmu, a co do możliwości dwóch głównych konkurentów perla i php? Popatrzmy.

III. Informacje o sprzęcie i oprogramowaniu.
Testy nie obejmowały czasów kompilacji kodów przez interpretatory, a jedynie operacje, które opisuję poniżej.
Do testów urzyto następujących narzedzi:
php – php-4.0.1pl2-9
perl – perl-5.6.0-9
system linux, kernel 2.4.8-ac9
Podstawowe informacje o sprzęcie:

  vendor_id       : GenuineIntel  cpu family      : 6  model name      : Pentium III (Coppermine)  cpu MHz         : 701.601  cache size      : 256 KB  bogomips        : 1399.19    MemTotal:        62348 kB  MemFree:          2072 kB  MemShared:         388 kB  Buffers:          1796 kB  Cached:          12408 kB  SwapCached:      34600 kB  Active:          41660 kB  SwapTotal:      690752 kB  SwapFree:       601588 kB    

i przyznaję – w czasie testów dysk od czau do czasu się zakręcił.

  1. Proste operacje na łańcuchach i funkcjach wyjścia.
    Zdefiniowałem dwa łańcuchy znaków i wykonywałem zdefiniowane w główce tabeli operacje.

        $a="Ala";  $b=" ma kota";    W tabeli, czasy wykonywania w sekundach 10000000 powtórzeń          $c=$a.$b        |    $c="$a$b"        |    |    echo "$a$b"         |    |    |    echo $a,$b        |    |    |    |    print "$a$b"        |    |    |    |    |    printf ("%s%s",$a,$b);        |    |    |    |    |    |        V    V    V    V    V    V  php   36   51   58   35   59   69  perl  17   17   -    -    37   39    

    Wynika stąd, że perl jest właścicwie niedoścignionym wzorcem, nawet przy tak prostych operacjach na łańcuchach znaków. Najbardziej interesujący jest brak różnic w kontaktacji łańcuchów przez perla powstałych poprzez $a.$b i „$a$b”, można więc przypuszaczać, że generowany jest identyczny wykonywalny kod, co w przypadku php jak widać nie jest prawdą. W przypadku php lepiej stosować echo niż inne funkcje wyjścia, najlepiej z operatorem przecinka, a łańcuchy najlepiej łączyć operatorem kropki.

  2. Interface z bazą danych.
    Ponieważ nie testuję samego serwera, a jedynie interface z bazą, więc tabela jest krótka, serwer mysql. Zarządanie zasobami wyników pozostawiłem interpreterom, tzn. nie zwalniam samodzielnie zasobów, powstałych po wykonaniu zapytania do bazy danych.
    Do testów użyto

      serwer baz danych : mysql-3.23.22-beta  moduł php         : php-mysql-4.0.1pl2-9  moduły perl       : DBI-1.20, DBD-mysql-2.0902  

    Dokładna definicja tabeli i tego co się w niej znajduje poniżej

      # Table structure for table 'test'    CREATE TABLE test (    pole char(50),    id int(11) NOT NULL auto_increment,    PRIMARY KEY (id)  );    # Dumping data for table 'test'  INSERT INTO test VALUES ('e15ae585aff9bb83ba199929d02386d7',1);  INSERT INTO test VALUES ('cb054fa671441a88dddf06711e1a17ea',2);  INSERT INTO test VALUES ('30e8e3b70890e6d43eb97fc54c9dd070',3);  INSERT INTO test VALUES ('a5a75979961f9dc7a7b4f274c62f8794',4);  INSERT INTO test VALUES ('0315a7bbae8d57445a4e0d8d965cdb3c',5);  INSERT INTO test VALUES ('a98f64249b25857ec927823553bcd27b',6);  INSERT INTO test VALUES ('a734ac38c2866ee851a644ddc6d91082',7);  INSERT INTO test VALUES ('4d2ff2d278e284bfa55a97bb9d9336dc',8);  INSERT INTO test VALUES ('4d2ff2d278e284bfa55a97bb9d9336dc',9);  INSERT INTO test VALUES ('78de18134bf45d7f484cacddfef9b0f5',10);  INSERT INTO test VALUES ('78de18134bf45d7f484cacddfef9b0f5',11);  INSERT INTO test VALUES ('e84010bf85dc25567c4795a85f532305',12);  INSERT INTO test VALUES ('e84010bf85dc25567c4795a85f532305',13);  INSERT INTO test VALUES ('e84010bf85dc25567c4795a85f532305',14);  INSERT INTO test VALUES ('1345c39d9d6baf6bddae8abf6d380610',15);  INSERT INTO test VALUES ('1345c39d9d6baf6bddae8abf6d380610',16);  INSERT INTO test VALUES ('115f2258b2ca298a6b661722d28383c0',17);  INSERT INTO test VALUES ('115f2258b2ca298a6b661722d28383c0',18);  INSERT INTO test VALUES ('115f2258b2ca298a6b661722d28383c0',19);  INSERT INTO test VALUES ('5c63d312d59376bfce1e6454975ea34c',20);  INSERT INTO test VALUES ('5c63d312d59376bfce1e6454975ea34c',21);  INSERT INTO test VALUES ('5c63d312d59376bfce1e6454975ea34c',22);  INSERT INTO test VALUES ('8f1f1ce94f59ec16cac4008ca56f3cb2',23);  INSERT INTO test VALUES ('8f1f1ce94f59ec16cac4008ca56f3cb2',24);  INSERT INTO test VALUES ('05d547f565fa6b65f06998ef6d1684b3',25);  INSERT INTO test VALUES ('05d547f565fa6b65f06998ef6d1684b3',26);  INSERT INTO test VALUES ('05d547f565fa6b65f06998ef6d1684b3',27);  INSERT INTO test VALUES ('f4c33ea5f4f32708ddd4b62af9c35d23',28);  INSERT INTO test VALUES ('f4c33ea5f4f32708ddd4b62af9c35d23',29);  INSERT INTO test VALUES ('5c79c92bce53b402daa4b3faa7be3693',30);  INSERT INTO test VALUES ('5c79c92bce53b402daa4b3faa7be3693',31);  INSERT INTO test VALUES ('5c79c92bce53b402daa4b3faa7be3693',32);  INSERT INTO test VALUES ('d52e39d0457ca33c76184b4c6b7fb9f6',33);  INSERT INTO test VALUES ('d52e39d0457ca33c76184b4c6b7fb9f6',34);  INSERT INTO test VALUES ('d7bbb7939a1ada55edaa48e715eb7e3f',35);  INSERT INTO test VALUES ('d7bbb7939a1ada55edaa48e715eb7e3f',36);    

    Wykonywane zapytanie:
    "select * from test where pole like '%af%'"
    powyższe zapytanie zwraca 5 rekordów z podanej tabeli.
    Poniżej czasy wykonania w sekundach 1000000 powtórzeń
    php 409 perl 983
    Tym razem php okazało się szybsze ponad 2x. Nie ma co prawda róży bez kolców – perl pozwala praktycznie bez zmiany kodu urzyć innego serwera baz danych, natomiast php wymaga niewielkich zmian.

IV. Podsumowanie.
Co więc jest lepsze? – osądźcie sami. Nie wiem wiele o perlu, przyznać trzeba, że operacje na łańcuchach znaków podniósł niemal do rangi sztuki, jednak nigdy nie były mi potrzebne zaawansowane możliwości wyrażeń regularnych perla, jakoś wystaczał skromniejszy ereg, czy ereg_replace. Natomiast na co dzień są mi potrzebne możliwości jakie dają mi interfejsy baz danych w których php sprawuje się bardzo dobrze, więc mój wybór php jako języka w którym się wyspecjalizowałem wydaje się ze wszech miar słuszny.
P.S. Nie testowałem prędkości przetwarzania wyników zapytań do baz danych, jeśli będzie jakieś zainteresowanie to postaram się je wykonać, lub jeśli już ktoś taki test wykonał to proszę o kontakt.
Marcin
Archiwalny news dodany przez użytkownika: Marcin.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Share →