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 <= 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 ;-)

9 Comments

  1. Kvailoka nekvailoka – bet greitis skirasi. Aisku, jei servas neapkrautas, projektas "Apie mano gyvunelius…" ir pan. – tada jokios prasmes. Esme ta, akd komentuoti reikia, bet galima kazkaip sumastyti, kaip pasalinti komentarus dedant i serveri pastoviam naudojimui.

    P.S. Pas tave su encodingu kazkias idomiai, nes pas Dzhiba iskreiptai tave rodo

  2. Čia kaip postinau tai kažką Mozilloj pridirbau ar iki galo neprikonfigūravau, tad el. paštas taip kreivai iki serverio nuėjo. Teko paskui tiesiai į duombazę rankas įkišus pamakaluot kad pasitaisytų ;)

    O šiaip manau jei kodas kešuojamas (Zend Optimizer?) tai neturėtų būti iš vis jokio skirtumo ar yra komentarai ar ne. Visgi ten kelių procentų kodo pagreitėjimas nieko neišgelbės — būtent kodo kešavimas turėtų paspartinti viską keletą kartų. Tiesiog mano nuomonė šiuo atžvilgiu — neverta prasidėt.

  3. Cia matai bent Lietuvoj tai jo. Bet tas pats faktas, kad norint optimizuot iki galo – galima ir si evil dalyka pasidaryt ;)

    O diskusijos irgi geras dalykas, prikelia is miego

  4. Hmmm… Aš esu iš vis prieš didelį optimizavimą iki nugriuvimo (juolab kad kaip tik kodo kešavimas turi išspręsti visas greičio problemas ir kartu panaikinti skirtumus tarp kodo su komentarais ir kodo su nustripintu whitespace, komentarais, pakeistais kintamųjų vardais į $a $b $c ir panašiai)

    darant tokias mikrooptimizacijas pražiopsoma dideli dalykai (jeigu taip jau labai reikia greičio, tai gal pasirašyt reiktų PHP extensioną su C — bent jau Perle toks sprendimas yra įprastas). Visada manau kad kodo profiliavimas ir būtent tų ilgiausiai užtrunkamų vietų optimizavimas iš esmės gali viską pakeisti (kartais tai pagreitina kodą iki dešimties kartų — teko pačiam matyt). O keli procentai yra nulis. Niekas to nepastebės. Ir kaip sakant "Rule 1. Do not optimize. Rule 2. (experts only!) Do not optimize. Yet."

    Na, žinau kad tu supranti ką verta optimizuot, o ko ne, tik va man baisu kad vaikai ką tik prisėdę prie PHP perskaitys tavo weblogą ir pamanys jog komentarai niekam verti ir jų niekad iš vis nereik dėti ;-)

  5. cia tai jo… del vaiku tu teisus. Mano manymu is viso reiktu – viena versija su komentarais ir dokumentais, o kita – kad ir i serva. Bet Lietuvoj to daryti dar nereikia. Siaip geriausias variantas – optimaizeriai. o gal encoderiai? :)

  6. Hmm… man tai visai gerai rodo. Problema sausainiukuose ir Javascript kuris keičia CSS. Bet juk ne dizaine esmė ;)

  7. ne dizaine, tru… bet usability siek tiek reiketu. ;) Kadangi pats megsti ilgus postus, tai siulau idet linka i komentarus ne tik virsuj, bet ir apacioj posto, nes perskaicius viska tenka lipt aukstyn.. O taip tingisi… :P

  8. "vaikai" ir taip komentaru nededa… Nes kvailas poziuris: "Svarbu veikia! Nesvarbu kaip…"

Comments are closed.