phpbar.de logo

Mailinglisten-Archive

[php] wie performanter gestalten

[php] wie performanter gestalten

Sebastian Mendel lists at sebastianmendel.de
Mon Jul 31 21:11:30 CEST 2006


Norbert Pfeiffer schrieb:
> Hallo,
> 
> eine Textdatei mit 11 Mio Zeilen wird geoeffnet und zeilenweise eingelesen.
> Dabei wird eine Schleife verwendet, die jeweils 99 Zeilen einliest, fuer
> jede Zeile get_browser aufruft und das Ergebnis in ein Array schreibt:

was ich probieren würde:

> <?php
> $OUT = array();
> $x = 0;
> while(!feof($f0)) {
>     $agent = trim(fgets($f0, 333));
^^ weglassen
>     $UA = get_browser($agent);
     $UA = get_browser($agent, true);
>     $BR = get_object_vars($UA);
^^ weglassen
>     $browser = $BR['browser'];
^^ weglassen
>     $n = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
>     $OUT[$browser] = $n;
^^ zusammenfassen
>     $x++;
>     echo ($x % 99 == 0) ? sprintf('% 11s', number_format($x,0,',','.')).
^^ 99 erhöhen

>          sprintf('% 7s', number_format(count($OUT),0,',','.'))."\n" : '';
> }
> ?>
> Leider braucht PHP dazu rund 2 sec pro Umlauf was auf eine
> Gesamtverarbeitungszeit von rund 15,5 Stunden schliessen laesst.
> 
> Wie bekommt man das auf ca. 1 Stunde runter ... ?

<?php
$OUT = array();
$x = 0;
while(!feof($f0)) {
    // PHP 4
    $UA = get_browser(fgets($f0, 333), true);
    $browser = $UA['browser'];
    // PHP 5
    //$browser = get_browser(fgets($f0, 333))->browser;
    $OUT[$browser] = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
    $x++;
    echo ($x % 99 == 0) ? sprintf('% 11s', number_format($x,0,',','.')).
         sprintf('% 7s', number_format(count($OUT),0,',','.'))."\n" : '';
}
?>

wie schnell ist denn get_browser()?

eventuell das Ergebnis cachen:

...
$agent = trim(fgets($f0, 333));
if (! isset($cache[$agent])) {
    $cache[$agent] = get_browser(fgets($f0, 333))->browser;
}
$OUT[$cache[$agent]] = (isset($OUT[$browser])) ? ($OUT[$browser] + 1) : 1;
...

php::bar PHP Wiki   -   Listenarchive