[Modul: Galerie] Dateibasierte Bilderabfrage bewirkt Serverlast

Begonnen von k00ni, 09. Juli 2007, 09:42:18

Vorheriges Thema - Nächstes Thema

k00ni

Nein. Da es in PHP keine strikte Typisierung gibt, mache ich zumindest am Anfang eines Skripts klar, was ich erwarte. Das hilft ungemein bei späteren Wartungsarbeiten.[/quote]
Ich arbeite dazu mit einer Art ungarischen Notation. Also mit ein oder mehreren Großbuchstaben im Namen für den Datentyp, somit weiß man immer, was fürn Typ die Variable (höchtwahrscheinlich) hat.
Hier mal nen Beispiel:
 

$A_ein_array
$S_ein_string
$Res_ein_mysql_result
$I_ein_integer

 
 
Ich schaue mir gerade die tool.php an. Ich werde deinen Quellcode als Funktion schreiben, muss dafür aber etwas abändern, beispielsweise diese \"die\"-Anweisungen. Hattest du nicht mal gesagt, die soll man vermeiden? /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" /> Ich schreibe dann einfach den nachfolgenden Code in einen else-Zweig oder positiviere die Abfrage einfach, also statt bspw. 0===, einfach ein 1=== damit spare ich mir eine else bzw. die Anweisung. Im Verlauf des Tages schreib ich wies lief.
[edit]Das mit dem 1=== nehme ich zurück, da du ja damit prüfst, ob Bilder da sind und nicht ob etwas war oder falsch ist. Mein Fehler.[/edit]
Grüße

k00ni

So,
mein erster Entwurf sieht folgendermaßen aus
 

 
Ich habe deinen Code, Statler, so angepasst, dass ich nicht 2 Variablen habe, die mir die Anzahl und die Dateigröße speichern, sondern ein Array, was dies übernimmt. Ich lasse mir dann einfach dieses zurückliefern und kann dann damit die Daten (umgewandelt) in unsere Datenbank eintragen. Eigentlich wollte ich dies alles in einer Funktion machen, was mir dann aber zu plump erschien, weshalb ich das nun trenne.
Meinungen und Ideen?

Powie

die beiden Varianten hätte ich mal gern gegeneinander auf eurer Datenbasis gebenchmarkt  !

k00ni

Wenn du mir sagst, wie ich das \"benchmarken\" könnte  :ugly: Hatte da mal so eine Idee: Vor der Funktion den Timestamp speichern und danach auch wieder, Differenz berechnen und dann in Sekunden umwandeln.  :gaga:

Powie


k00ni

Bekomm das nicht hin. Ich arbeite über folgendes und bekomme nur Minuswerte.
 

Meine Funktion:\';
$A_file_information = get_file_number_and_size ($pi_import_dir);
echo \'Meine Zeit: \'. microtime (get_as_float) - $my_time;
$powie_time = microtime ();
echo \'Powies Funktion:\';
$A_file_information = powies_file_count_size ($pi_import_dir);
echo \'Powies Zeit: \'. microtime (get_as_float) - $powie_time;
$statler_time = microtime ();
echo \'Statler Funktion:\';
$A_file_information = statler_file_count_size ($pi_import_dir);
echo \'Statler Zeit: \'. microtime (get_as_float) - $statler_time;
?>

k00ni

Ich weiß zwar nicht, ob das was bringt jetzt, aber ich poste mal meine \"Ergebnisse\". Berechnung für 100 Bilder im Ordner \"import\".
Folgende habe ich:
 

Meine Funktion: -0.780816
Powies Code: -0.84424
Statlers Code: -0.882542

 
 
Nachfolgend ist der Code für die Berechnung:
 

So und nun der Benchmark (100 Dateien)
\'. microtime () - $my_time .\'\';
//--------------------------------------------------------------------------
$powie_time = microtime ();
clearstatcache();
$fp=opendir($pi_import_dir);
while ($datei = readdir($fp)) {
if ($datei != \"..\" and (\"$S_dir_path/$datei\")) {
         $A_file_information [\'file_amount\'] = $A_file_information [\'file_amount\'] +1;
         $A_file_information [\'file_size\']=
            $A_file_information [\'file_size\']+filesize(\"$pi_import_dir/$datei\");
     }
}
@closedir($pi_import_dir);
 
echo \'Powies Zeit: \'. microtime () - $powie_time .\'\';
//--------------------------------------------------------------------------
$statler_time = microtime ();
$files_size     =   (int) 0;
$files_amount   =   (int) 0;
$items          =   (array) array();
$item           =   (string) \'\';
if(false === chdir($pi_import_dir))
{
    die(\"Can\'t cd to $pi_import_dir. Aborting.\");
}
clearstatcache();
$items = glob(\'*\');
if(0 === sizeof($items))
{
    die(\"No items. Aborting.\");
}
foreach($items as $item)
{
    if(false === is_file($item))
{
        continue;
}
    ++$files_amount;
    $files_size  +=   filesize($item);
}
echo \'Statler Zeit: \'. microtime () - $statler_time;
?>

 
 
Und meine Funktion sieht folgendermaßen aus:
 

 
Für meinen ersten Benchmark doch schonmal garnicht schlecht  /uploads/emoticons/icon_e_surprised.gif.a8707b3f35a569cb4cfe563fc72ef78d.gif\" alt=\":-o\" /> :ugly:

Hattest du nicht mal gesagt, die soll man vermeiden?[/quote]
Ja. Aber ich hatte das Skript in ein paar Minuten runtergehackt - das Skript lief ja nur standalone und Error Handling wollte ich nicht haben.
Ich weiß zwar nicht, ob das was bringt jetzt, aber ich poste mal meine \"Ergebnisse\". Berechnung für 100 Bilder im Ordner \"import\".[/quote]
Ich hatte auf der Konsole mit einem php-fcgi-Binary (ohne FCGI-Server) mit time gebenchmarkt.
Der \"Benchmark\" kann sowieso nur einen Anhaltspunkt liefern: Mein PHP ist extrem optimiert und schlank - dein PHP vermutlich nicht. Deswegen sind die Ergebnisse mit Vorsicht zu genießen - und deswegen hatte ausdrücklich einen Faktor angegeben.
Leider habe ich die Testbilder inzwischen wieder von der Platte entfernt, so dass ich nicht neu testen kann.

Wenn du mir sagst, wie ich das \"benchmarken\" könnte [ugly] Hatte da mal so eine Idee: Vor der Funktion den Timestamp speichern und danach auch wieder, Differenz berechnen und dann in Sekunden umwandeln.[/quote]
Hat den Nachteil, dass Du die time()-Funktion mitbenchmarkst. Aber um einen Unterschiedsfaktor zu bekommen sollte es reichen.

Ich arbeite dazu mit einer Art ungarischen Notation. Also mit ein oder mehreren Großbuchstaben im Namen für den Datentyp, somit weiß man immer, was fürn Typ die Variable (höchtwahrscheinlich) hat.[/quote]
Hatte ich eine Zeit im Einsatz, gefiel mir aber nicht gut. Ich fand es irgendwie nervig, immer Underscores einzubauen.

k00ni

Ich hatte auf der Konsole mit einem php-fcgi-Binary (ohne FCGI-Server) mit time gebenchmarkt.Der \"Benchmark\" kann sowieso nur einen Anhaltspunkt liefern: Mein PHP ist extrem optimiert und schlank - dein PHP vermutlich nicht. Deswegen sind die Ergebnisse mit Vorsicht zu genießen - und deswegen hatte ausdrücklich einen Faktor angegeben.
[/quote]
Na ich hab doch keine Ahnung. Ich finds schon scheiße, dass hier Minuswerte rauskommen, obwohl ich eigentlich richtig berechnen lasse. Und mein Code ist eigentlich dein Code nur etwas angepasst. /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" /> Das einzigste Manko was ich bei mir feststellen kann, ist der Aufruf über eine Funktion (langsamer als direkter Code) und dass ich per Array arbeite, statt mit 2 Variablen. Was könnte noch \"unoptimierter\" sein, als bei dir ?
 
Grüße
ps.: Wie bekomm ich dieses kack Minus davor weg?

Powie

K00ni. Nicht die Funktion benchmarken sondern den Durchlauf über deine ganze Datenbasis. Also wielang das parsen der gesamten tool.php dauert!?

k00ni

Ok, ich dachte nur die Funktion für das Berechnen der Bilderanzahl und -größe. Ich poste dir die Daten, wenn wir das Skript auf unserer Seite aktualisiert haben.
 
Grüße

k00ni

Also ich habe mal schnell die Renderzeit ausgeben lassen bei deinem pImage. Sie betrug 18.4276 Sekunden bei 15005 Bilder. Wies nach unserem Update ausschaut, wie gesagt, kommt später.
 
Grüße

So, ich hab mir das nochmal angeschaut und mit xdebug profiled. Die Ergebnisse findest Du unter
http://storage.cj-soft.de/powie/psys_image_benchmark/\" rel=\"external nofollow\">http://storage.cj-soft.de/powie/psys_image_benchmark/
Ich musste dein Skript übrigens fixen.

all your base are belong to us / Discord