Perl vs. PHP

anddie

Well-known member
ID: 171
L
3 Mai 2006
2.270
133
Hi,

ich habe das Problem, dass ich ein ca. 12-15MB großes Textfile aufbereitet auf einer Webseite darstellen muss.
Mit PHP war das relativ fix erledigt (weil ich halt schon was passendes dahatte), allerdings ist das bei der derzeitigen if-Bedingung und der Größe des Textfiles etwas lahm.

Jetzt wollte ich mal wissen, wenn ich es über ein CGI und somit über Perl mache, ob es da prinzipiell schneller werden dürfte.

anddie
 
fährt Auto A schneller als Auto B ?

also, wenn du uns den Code nicht zeigst, kann man dir auch nicht sagen, ob vllt schon deine Umsetzung der Idee so resourcenlastig ist.
Da PHP aber ein Cache-Limit um die 12-15mb hat, würde ich nunmal zu Perl raten, denn ich meine dies gäbe es da nicht. Aber man könnte ja auch nur Teile aus dem File auslesen wollen, ohne genaue Beschreibung und Code kann man dir da nicht helfen.
Und bitte stelle keine Frage ob PHP oder Perl besser ist, denn das ist ein Glaubenskrieg:roll:
 
also, wenn du uns den Code nicht zeigst, kann man dir auch nicht sagen, ob vllt schon deine Umsetzung der Idee so resourcenlastig ist.

Mal grob hingerotzt. Eigentlich sieht das if sogar noch perverser aus. Hatte schon überlegt, ob ich alles was mit oder dort verknüpft ist immer als elseif mache.

PHP:
$fp1 = fopen("$fp", "r");
while($line=fgets($fp1,1024))
{
  $array = explode(",",$line);

  if ( ( ($datensatz['mandant'] == 'MCH') && ( ($array['11'] == "MCH") || ($array['11'] == "STGW") ) ) || ($array['2'] == "Unknown") )
  {
     echo "<tr><td>$array[1]</td><td>$array[2]</td><td>$array[11]</td><td>$array[5]</td><td>$array[6]$array[7]</td></td></tr>\n";
  }
  else
  {
    continue;
  }
}
fclose($fp1);

anddie
 
Das wäre ja noch ressourcenfressender. Mit der momentanen Variante wird immer nur eine Zeile im Speicher gehalten. Mittels file() würden alle Zeilen im Speicher geladen sein...
 
Wäre bei soetwas nicht file() besser?
Derzeit hab ich kleine Dateien mit ca. 8-10 MB. Da bereitet es mir schon Bauchschmerzen, die mit file() komplett in ein Array zu lesen. Die Dateien werden allerdings wohl in absehbarer Zeit so 3-4x so groß. Da mach ich das doch lieber zeilenweise.

Was mich halt noch interessiert, ob es schneller ist, wenn ich eine Abfrage der Form:
if (
(Bed1 && (Bed2 || Bed3)) ||
(Bed.4 && (Bed.5 || Bed6)) ||
(Bed7)
)
(habs mal farbig gemacht, damit man sieht, was zusammengehört)
genauso schnell ist, wie ein
if ( Bed1 && (Bed2 || Bed3))
elseif ( Bed4 && (Bed5 || Bed6))
elseif (Bed7)

anddie
 
Die Geschwindigkeit dabei hängt stark davon ab, wie PHP die bool'schen Ausdrücke auswertet. Wenn von links nach rechts und die anderen Teilausdrücke nicht mehr ausgewertet werden, wenn der erste true ist, dürfte es keinen Unterschied machen, ob Du einen Ausdruck nimmst oder viele per if/elseif.

Ich hab grad mal getestet, wie PHP sich diesbezüglich verhält:
PHP:
<?php
  function foo($bar) {
    echo 'foo';
    return true;
  }
  if (foo(1) or foo(2)) {
  }
?>
Ergebnis: Es wird 1x foo ausgegeben, was bedeutet, dass PHP die Bearbeitung des Ausdrucks abgebrochen hat, nachdem die erste Teilbedingung wahr war (was ja durch das or dazu führt, dass die gesamte Bedingung wahr wird).

Nun könntest Du das Skript insofern optimieren, dass Du die Bedingung, die am wahrscheinlichsten wahr wird, an den Anfang stellst.

Eine weitere Optimierung wäre evtl ein eigenes Buffern, so dass Du nicht zeilenweise aber auch nicht komplett einliest. Ich weiss nun nicht, wie sich PHP da verhält, aber wenn Du immer nur kleine Stückchen (die evtl sogar noch kleiner als ein Sektor auf der Platte sind) einliest und PHP das nicht selbst buffert, bedeutet das immer Zeitverlust. Würdest Du bspw 8k/16k/32k-Blöcke einlesen, dürfte das Einlesen auf jeden Fall schneller werden. Im gleichen Masse würde aber auch das Skript komplexer. In der Doku hab ich leider nur was über den Writebuffer gefunden, nicht aber über den Readbuffer.

Eine letzte kleine Optimierung am Rande:

Falls Dein Skript wirklich derart aufgebaut ist, lass das else continue; einfach weg. Wozu den Rest der Schleife überspringen, wenn da eh nix mehr passiert... ;)
 
Wenn du scharf auf die Geschwindigkeit bist, warum nicht in C? Kannst Problemlos als CGI einbinden und wird wohl 2-5x schneller sein als PHP. Aber werd das morgen evtl mal Testen. Nimmt mich Wunder welche Sprache hier wie schnell ist. Und zum alles auf einmal Lesen, ich bin mir nicht sicher ob das wirklich so dumm ist. Es braucht zwar kurzzeitig mehr Memory, dürfte aber schneller sein. Und wenn man nun in betracht zieht was 128mb Memory und was 1ne Stunde länger Optimieren kosten ;)
 
warum nicht in C? Kannst Problemlos als CGI einbinden und wird wohl 2-5x schneller sein als PHP.
Wenn ich dem Admin sage, der soll mir für die CGI-Schnittstelle außer Perl auch noch C zur Verfügung stellen, dann erschlägt der michl.

die if- Frage passt zwar net ganz zu meinem Fall, aber der Test mit den Dateioperationen ist schonmal interessant.
Wobei ich derzeit doch schon fast überzeugt bin, das Ganze nach Perl umzuwursten *grusel* Wobei ich da so spontan gar net weiß, wie man dort lustig die ganzen Sessions mitnimmt.

anddie
 
sicher dass das an der bedingung leigt warum das so lahm ist? hast du das ganze mal ohne echo durchlaufen lassen?
 
sicher dass das an der bedingung leigt warum das so lahm ist? hast du das ganze mal ohne echo durchlaufen lassen?
Ohne echo, nur mit Hochzählen einer Variable dauerts vielleicht 2-3 Sekunden.
Im Firefox gehts mit echo auch schneller, weil der sofort anfängt, die Tabelle anzuzeigen, was der IE leider net macht.

Werde es trotz allem mal mit file_get_contents() testen, was dort passiert.

anddie
 
Wenn ich dem Admin sage, der soll mir für die CGI-Schnittstelle außer Perl auch noch C zur Verfügung stellen, dann erschlägt der michl.

Naja, wenn du wirklich CGI aktiviert hast (nicht mod_perl oder sowas) kann deinem Admin ziemlich egal sein was fuer ein Binary da liegt. CGI bedeutet einfach nur, dass der Webserver die Datei ausfuert - quasi ein exec() mit ein paar Umgebungsvariablen.
 
Naja, wenn du wirklich CGI aktiviert hast (nicht mod_perl oder sowas) kann deinem Admin ziemlich egal sein was fuer ein Binary da liegt. CGI bedeutet einfach nur, dass der Webserver die Datei ausfuert - quasi ein exec() mit ein paar Umgebungsvariablen.

nen mir nen Webhoster, der dir volle CGI-Unterstützung aktiviert, wäre ja schön blöd, also ich hätte da einige Ideen was man anstellen könnte (rainbow-Tables etc.) :biggrin:
 
Naja, wenn du wirklich CGI aktiviert hast (nicht mod_perl oder sowas) kann deinem Admin ziemlich egal sein was fuer ein Binary da liegt.
Hmmm, wie krieg ich das denn raus?

nen mir nen Webhoster, der dir volle CGI-Unterstützung aktiviert, wäre ja schön blöd, also ich hätte da einige Ideen was man anstellen könnte (rainbow-Tables etc.) :biggrin:
Da das ein Firmenserver ist, der auch nicht im Internet hängt, ist das wurscht. Im Endeffekt isses mir eh wurscht, hauptsache es funktioniert.

anddie