cgi mit c und html
-
Das .exe-File hängt genauso im Cache wie der PHP-Quelltext. Ich weiß nicht, wo es
da Unterschiede geben könnte. Meistens ist die Laufzeit des Programms eh wurscht,
die Antwortzeiten ergeben sich aus der Übertragung über http.egal, ich hatte PHP mal ausprobiert und für zu leicht befunden. Ist ja auch in C
geschrieben, da nehme ich lieber das Original
-
Scheppertreiber schrieb:
Das .exe-File hängt genauso im Cache wie der PHP-Quelltext. Ich weiß nicht, wo es
da Unterschiede geben könnte. Meistens ist die Laufzeit des Programms eh wurscht,
die Antwortzeiten ergeben sich aus der Übertragung über http.egal, ich hatte PHP mal ausprobiert und für zu leicht befunden. Ist ja auch in C
geschrieben, da nehme ich lieber das OriginalAlso Du musst Dich schon entscheiden: Ist PHP schlecht, weil es zu langsam ist oder ist die Laufzeit des Programms eh wurscht?
Na egal - Du sagst, dass das .exe-File genauso im Cache hängt, wie der PHP-Quelltext. Wie erklärst Du Dir dann, dass das PHP-Programm bei meinem Rechner ca. 12 mal so viele Requests pro Sekunde schafft?
Da kann man diskutieren, wie man will. Ein Test liefert Fakten.
-
Für meine Zwecke ist PHP zu langsam.
-
Interessant wären mal die Quelltexte der Seite, damit man die Tests mal nachvollziehen kann.
-
Also ein wenig mehr Details zu den Benchmarks:
Das Testprogramm ist die Hello-World-Demo aus meinem tntnet. Das habe ich teilweise in einer vereinfachten Form. Hier ist die Perl-Variante:#!/usr/bin/perl -w use strict; use CGI; my $q = new CGI; my $name = $q->param('name'); my $greet = $name || 'World'; print $q->header; print <<"EOF"; <html> <head> <title>Hello World-application for tntnet</title> </head> <body bgcolor="#FFFFFF"> <img src="tntnet.jpg" align="right"> <h1>Hello $greet</h1> <form> What's your name? <input type="text" name="name" value="$name"> <br> <input type="submit"> </form> </body> </html> EOF
Hier die C-Variante (die reagiert nicht auf Eingaben):
#include <stdio.h> int main() { puts("ContentType: text/html\r\n\r\n" "<html>\n" " <head>\n" " <title>Hello World-application for tntnet</title>\n" " </head>\n" "\n" " <body bgcolor=\"#FFFFFF\">\n" " <img src=\"tntnet.jpg\" align=\"right\">\n" "\n" " <h1>Hello World</h1>\n" "\n" " <form>\n" " What's your name?\n" " <input type=\"text\" name=\"name\" value=\"\"> <br>\n" " <input type=\"submit\">\n" " </form>\n" "\n" " </body>\n" "</html>"); }
Die PHP-Variante:
<?php $name = $_GET['name']; ?> <html> <head> <title>Hello World-application for tntnet</title> </head> <body bgcolor="#FFFFFF"> <img src="tntnet.jpg" align="right"> <h1>Hello <?= $name == "" ? "World" : $name ?></h1> <form> What's your name? <input type="text" name="name" value="<?= $name ?>"> <br> <input type="submit"> </form> </body> </html>
Und die Tntnet-Variante:
<%args> name; // define query-parameter // this defines a variable of type std::string with // the name "name" </%args> <html> <head> <title>Hello World-application for tntnet</title> </head> <body bgcolor="#FFFFFF"> <img src="tntnet.jpg" align="right"> <h1>Hello <$ name.empty() ? "World" : name $></h1> <form> What's your name? <input type="text" name="name" value="<$name$>"> <br> <input type="submit"> </form> </body> </html>
Das Perl-Skript habe ich in das cgi-bin-Verzeichnis meines Server gestellt. Das C-Programm mit "gcc -o hello -O2 hello.c" übersetzt und in das Kompilat in das cgi-bin-Verzeichnis gestellt. Das PHP-Programm kommt in das htdocs-Verzeichnis. Die Tntnet-Variante wird mit Tntnet übersetzt. Dort habe ich lediglich die tntnet.properties editiert um das Logfile in eine Datei statt auf die Konsole zu schreiben. Die statische Seite habe ich einfach per curl erzeugt und in das htdocs-Verzeichnis gestellt.
Getestet habe ich mit: "ab -n 1000 -k -c 3 http://localhost...". Das -n habe ich für die schnelleren Varianten erhöht um eine relevante Laufzeit zu erhalten.
Mein Rechner ist ein AMD64-3000 mit Kubuntu 7.10. Der Webserver ist apache2, der mit Kubuntu installiert wird. Tntnet ist natürlich die aktuellste Version.
-
Interessant.
Die Laufzeiten sind in der Praxis natürlich auch von der Komplexität der
Anwendung abhängig. Wenn Du da Zugriffsrechte laden und größere Datenbanken
abfragst sieht's halt anders aus.Ich habe zB mal eine Woche in PHP investiert und habe es dann doch wieder
in C gemacht. Die Vorteile, die ich durch die nun wirklich legendäre Flexibilität
und frei definierbare Strukturen habe kann PHP einfach nicht. Dafür ist es ja
auch nicht gemacht.Würde ich solche Benchmarks machen, müßte ich das in PHP nachbauen, halt eine
Sauarbeit. Interessant wäre es schon.Gruß Joe.
-
Könntest du den Benchmark mal mit "Numbercrunching" wiederholen.
Also z.b. rekursives Berechen von fibo(11) oder so ?
-
WurzelGnom schrieb:
Könntest du den Benchmark mal mit "Numbercrunching" wiederholen.
Also z.b. rekursives Berechen von fibo(11) oder so ?Sag mir mal, wie das in PHP geht. Dann mache ich den Benchmark.
-
Um mir mal selbst zu antworten: http://www.scriptol.org/fibonacci-any-programming-language.html#php. utfg (use the fine google)
. Benchmark kommt heute Abend.
-
ok - wie versprochen hier die Ergebnisse. Aber zunächst eine kleine Korrektur. Ich habe in dem C-Programm das puts durch printf ersetzt und da kommt das auf ca. 300 #/sec. Ich begreife nicht, wie printf schneller sein kann, als puts. Aber man muss ja nicht alles verstehen.
Also jetzt zum Fibonacci. Eigentlich ist es ja ein ziemlich sinnfreier Test, da zumindest ich ein Numbercruncher-Programm nicht als Webapplikation programmieren würde. Aber dennoch zeigt es, was wir sehen wollen: C ist viel besser als PHP. Zumindest als Numbercruncher. Hier die Ergebnisse für fibo(11), fibo(20) und fibo(30):
CGI/Perl: 28 / 19 / 0,5 CGI/C: 303 / 286 / 87 PHP: 1323 / 58 / 0,36 Tntnet: 7452 / 5068 / 109
Wir sehen hier tatsächlich, dass PHP in der Ausführungsgeschwindigkeit offensichtlich noch hinter Perl liegt. Die compilierten Varianten sind natürlich weit im Vorteil. Für mich ist es wieder mal erfreulich (und nicht anders zu erwarten), dass Tntnet allen weit überlegen ist, da es sowohl persistent als auch compiliert ist. Bei längeren Berechnungszeiten wird natürlich die Startzeit des Programms vernachlässigbar. Interessanter wäre sicher eine richtige Webanwendung mit Datenbankanbindung und so.
-
tntnet schrieb:
Ich begreife nicht, wie printf schneller sein kann, als puts.
puts macht jedesmal einen system-call um den string sofort auszugeben. printf puffert die daten und braucht daher weniger syscalls. mach printf ohne pufferung und es wird langsamer sein als puts
-
fricky schrieb:
tntnet schrieb:
Ich begreife nicht, wie printf schneller sein kann, als puts.
puts macht jedesmal einen system-call um den string sofort auszugeben. printf puffert die daten und braucht daher weniger syscalls. mach printf ohne pufferung und es wird langsamer sein als puts
Eine schöne Erklärung, erklärt aber leider nicht diesen Fall. Wenn Du Dir meinen C-Code anschaust, jage ich die komplette HTML-Seite mit einem einzigen puts auf die Standardausgabe. Da müsste ja puts von sich aus mehrere Systemaufrufe pro Aufruf machen.
-
puts(), printf() etc machen buffered I/O, write schreibt's direkt.
Steht in jedem Manual.
-
Scheppertreiber schrieb:
puts(), printf() etc machen buffered I/O, write schreibt's direkt.
Steht in jedem Manual.Das ist schon klar. Das Problem ist ein anderes. Warum ist:
printf("<html>blah blah blah</html>");
schneller als:
puts("<html>blah blah blah</html>");
Wie Du sagst machen beide buffered I/O. Nach meinem Verständnis müsste puts mindestens so schnell sein, als printf. Printf parst ja sogar zur Laufzeit den String. Da müsste es ja eher langsamer sein. Ich würde ja verstehen, wenn die beiden genauso schnell wären. Da könnte man noch argumentieren, daß das Parsen im rahmen der Messungenauigkeit im Rauschen untergeht.
Aber nochmal: printf ist (bei meiner Umgebung) schneller als puts (Steht in jeder Nachricht von mir)
-
Hi TNT,
erkläre erst mal wie Du das gemessen hast. Eigentlich sollte puts schneller sein.
Vielleicht ist aber printf optimiert und erkennt wenn keine Formatierung notwendig
ist. kA.