Dar vieno analitiko svetainė

Petras Kudaras

Benchmarkai

LG
sumąstė labai sick idėją – paaukoti kodo komentarus
vardan kodo greičio. Na, nieko čia nuostabaus, kad kodas be komentarų
veikia greičiau – juk greičiau jis nuskaitomas iš disko (Nes
mažiau skaityt. Logiška.) Šiaip pati kodo greitinimo idėja išimant
komentarus yra E V I L
dar išimkit visus tarpus, ir tada bandykit redaguot tą kodą ;-)

Pasibenchmarkinau ir aš. Pagrindinis testavimo skriptas yra paleidžamas iš konsolės. Štai jis
(nenaudoju Benchmark modulio, nes jis skaičiuoja tik realų
procesoriaus laiką, o mums kaip tik reik žinot kiek laiko laukiama
duomenų iš serverio nieko neveikiant):

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use Time::HiRes qw/tv_interval gettimeofday/;

cmpthese(1000, { 'full_php' => sub { get "http://localhost/full.php"},
                 'nokom_php'=> sub { get "http://localhost/nocom.php"},
                 'full_pl' => sub { get "http://localhost/full.cgi"},
                 'nokom_pl' => sub { get "http://localhost/nocom.cgi"},
                 'full_pasm'  => sub { get "http://localhost/full_pasm.cgi"},
                 'nokom_pasm' => sub { get "http://localhost/nocom_pasm.cgi"},
                 'full_c'    => sub { get "http://localhost/full_c.cgi"}});

sub cmpthese {
        my ($kiek, $ka) = @_;
        my $result = {};
        for my $kuri ( keys %{$ka} ) {
                my $start = [gettimeofday];
                &{$ka->{$kuri}} for (1..$kiek);
                $result->{$kuri} = ($kiek/tv_interval($start, [gettimeofday]));
        }
        my @r = sort { $result->{$a} <=> $result->{$b} }
                keys %{$result};
        printf "%10s %.2f kartu/s\\n", $_, $result->{$_} for @r;
}

O štai patys tikrinami skriptai:

full.php

<?php
# blah blah blah
/* blah blah blah */
// blah blah blah
for ($i = 10; $i <= 1000; $i++) {
print "blah";
}
?>

nocom.php

<?php
for ($i = 10; $i &lt= 1000; $i++) {
print "blah";
}
?>

full.cgi (Perlas per CGI)

#!/usr/bin/perl
print "Content-type: text/html\n\n";
# blah blah blah
=blah
blah blah blah
=cut
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

nocom.cgi

#!/usr/bin/perl
print "Content-type: text/html\n\n";
for (my $i = 10; $i <= 1000; $i++) {
print "blah";
}

full.c (kompiliuotas su gcc -O3 -o full_c.cgi full.c)

int main() {
        int i;
        puts("Content-type: text/html\n\n");
        for(i = 10; i <= 1000; i++) {
                puts("blah");
        }
        return 0;
}

full_pasm.cgi (Parrot v0.0.11 assembly, kompiliuojamas on-the-fly)

#!/usr/bin/parrot -a
# blah blah blah
# blah blah blah
# blah blah blah

        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

nocom_pasm.cgi

#!/usr/bin/parrot -a
        set S0, "Content-type: text/html\n\n"
        print S0
        set I0, 10
        set S1, "blah"
FOO:    print S1
        inc I0
        le I0, 1000, FOO
        end

Štai rezultatai:

full_pasm 92.14 kartu/s
nokom_pasm 92.35 kartu/s
   full_pl 130.01 kartu/s
  nokom_pl 139.57 kartu/s
    full_c 189.88 kartu/s
  full_php 236.95 kartu/s
 nokom_php 278.25 kartu/s

PHP komentarai daro atrodo 17% įtaką kodo greičiui (kas tikrai daugoka),
Perlo CGI kodo su komentarais ir kodo be komentarų skirtumas yra 7% (hmm…
reiktų pasibandyt su kešuojančiu mod_perl – iš vis neturėtų būti skirtumo).
Parrot atrodo tie komentarai nei šilta nei šalta.

Kad ir kaip ten bebūtų, komentarų išėmimas dėl greičio padidinimo yra manau
kvailokas dalykas. Geriau jau kompiliuotis kodą, laikytis jį keše (Zend optimizeriai?).
Na, jei jau labai labai reikia tų kelių procentų grečio padidėjimo (kažkaip abejotina), tai
visada galima pasirašyti perlinį skriptuką, kuris nustripins visus komentarus,
kai jau ruošitės viską dėti į serverį ;-) (ir tai jokiu būdu nereiškia kad galit nekomentuot
savo kodo ;-)