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 ;-)
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
Č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.
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
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 ;-)
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? :)
Beje, pas tave ateinant is Dzhibo – puslapi rodo labai iskreiptai (su IE)
Hmm… man tai visai gerai rodo. Problema sausainiukuose ir Javascript kuris keičia CSS. Bet juk ne dizaine esmė ;)
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
"vaikai" ir taip komentaru nededa… Nes kvailas poziuris: "Svarbu veikia! Nesvarbu kaip…"