Laden...

Vergleich von PHP und ASP.NET Anhand eines konkreten Projekts

Erstellt von Raptor 2101 vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.886 Views
R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren
Vergleich von PHP und ASP.NET Anhand eines konkreten Projekts

Bevor jetzt der Flamewar losgeht bitte ich alle beteiligten erst das Dokument im Anhang zu lesen 😉.

Eins Vorweg, ich hab wenig brauchbares im Deutschprachigen (auch im englisch sprachigen) Raum gefunden, wenn es um die Frage geht: PHP oder ASP.NET. Viele Quellen Orakeln oder geben diffuse Aussagen.

Da ich gerade vor einer solchen Entscheidung (im Privaten Sektor stehe) habe ich für alle den es Ähnlich geht mal ein kleines Dokument verfasst, was meine Beobachtungen/Ergebnisse schildert.

Wer Fragen hat oder sich beschweren will poste hier 8)

Hinweis von herbivore vor 12 Jahren

Im Anhang befinden sich ein PHP-Projekt, das zum Vergleich in ASP.NET umgesetzt wurde, sowie ein PDF-Dokument, das die Unterschiede zwischen PHP und ASP.NET bezogen auf die beiden Projekte analysiert.

Gelöschter Account
vor 15 Jahren

jedoch stehen fast immer kostenlose
Express-Editionen zur Verfügung. Diese sind für den nicht-kommerziellen Gebrauch kostenlos.

diese sind auch für den kommerziellen bereich kostenlos.

evtl hast du in php einiges optimierter gemacht als es in asp umgesetzt wurde?

dieser extreme unterschied lässt bei mir zumindest den verdacht aufkommen, das acuh dieser test unzureichend .net-seitig implementiert ist.

edit:

In einem dritten Testfall wird die Parallel-Umgebung
getestet. Da das extrahieren von Flights unabhängig voneinander erfolgt, kann diese
Verarbeitung parallel erfolgen. Dazu muss nur mittels MultipleActiveResultSets=true im
Verbindungs-String das MARS aktiviert sein. So können gleichzeitig mehrere DataReader
genutzt werden.

schon mal auf der msdn gelesen, was das macht und warum man es nicht einsetzen soll?

edit2:

                SqlCommand command = new SqlCommand("SELECT Top "+counter+" FlightID FROM Flight", Database.Connection);
                ds = new DataSet();
                adapter = new SqlDataAdapter(command);
                adapter.Fill(ds);
                xmlDoc = new XmlDocument();
                flights = xmlDoc.CreateElement("flights");
                start = DateTime.Now;

jetzt wundert es mich nicht mehr.
und das auch noch in einer forschleife. wozu erzeugst du die großen objekte immer und immer wieder? klar das dann der overhead den du hier mitschleppst alles kaputt macht.

ps: datetime ist der wohl undenaueste performancemesser den ich kenne.

edit3:

jetzt wo ich mir beiden code angesehen habe, wird mir alles klar.
man kann nicht code 1:1 umsetzen und das dann für einen test hernehmen. selbiges nämlich könnte man genausogut andersherum machen. wenn du etwas aussagekräftigeres haben willst, musst du es auf beiden seiten technologiespeziefisch implementieren und nicht 1:1

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

wenn datetime der ungenauste perfomance tester ist, was ist dann time unter php für dich 😉 oder anders gesagt, was nützt es mir wenn ich einen test fahre und externe testtools nutzte und das ganze am ende in einer gebremsten VM Läuft.?ähm entweder hast du grafiken falsch interpretiert oder ich versteh deine aussage nicht.

  1. zeigen die test das .NET schneller ist
  2. warum erzeuge ich die graßen elemente in der schleife, weil ich es kann und es für die Zeitmessung keine Rolle spielt. die äußere For-Schleife baut nur die zu lesenden FlightIDs auf....

die umsetztung ist nicht ein zu eins😉 das eine ist Objectorientiert und das andere Prozedual. Die Randbedingungen wie die Datenhaltung/Basisdaten aussehen und wie die Daten zum user kommen (XML) beschränken hingegen die möglichkeiten... wobei ich bei der Datenhaltung wenig optimierungsmöglichkeiten sehe

edit: zum thema mars. Ich hab es in diesem zusammenhang nur genutzt um mir zu ersparren ein Connection Pooling zu integrieren. Das Zielsystem verfügt momentan über einen singlecore, da werd ich mich hüten irgendwas paraleles einzubauen, das währe verschwendung. Das mit dem Parallel.Forech war eher ein test meinerseits und ich war positiv überascht. Ich hatte erwartet, dass die paralaele ausführung erst ab 250-500 Flights schneller ist...

G
497 Beiträge seit 2006
vor 15 Jahren

du hast den Performancetest in einer VM gefahren? Das macht die Werte etwas weniger aussagekräftig, da die Leistung von Anwendungen in einer VM aufgrund dieser zusätzlichen Schicht schon etwas anders skaliert als auf realer Hardware.

ein Fehler in dem Vergleich: .NET ist nicht vollständig von Windows und IIS abhängig. Zum einen kann man .NET-Code auch mit dem Apache ausführen (mittels mod_aspdotnet), zum anderen gibt es auch Mono, das zumindest .NET 2.0 fast vollständig implementiert.

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

Nein der Test lief bei mir auf dem im Dokument angegeben system
die endgülige anwendung wird auf ein gehosten Server laufen der in einer VM steckt, deswegen habe ich auf die volle auflösung mittels eines externen Testers verzichtet, gerade weil am ende die sache in einer VM läuft, für mich waren nur die Größenfaktoren interessant

zu Mono und mod_aspdotnet: deswegen schrieb ich "momentan", hätte noch eine Footnote drann gemust das ich die aussage auf 3.5 bezogen habe...

Gelöschter Account
vor 15 Jahren

wenn datetime der ungenauste perfomance tester ist, was ist dann time unter php für dich oder anders gesagt, was nützt es mir wenn ich einen test fahre und externe testtools nutzte

brrr... StopWatch.... das nimmt man für performancetests.

warum erzeuge ich die graßen elemente in der schleife, weil ich es kann und es für die Zeitmessung keine Rolle spielt. die äußere For-Schleife baut nur die zu lesenden FlightIDs auf....

falsch bleibt falsch. egal ob das ins ergebniss einfließt. das problem ist, das du somit speicher frisst und das der garbagecollector irgendwann in tests unnötigerweise angeworfen wird, was das ergebniss beeinträchtigt.

die umsetztung ist nicht ein zu eins das eine ist Objectorientiert und das andere Prozedual.

die umsetztung ist vom ablauf her 1:1. mehr angleichen ist fast nicht mehr möglich und das ist in meinen augen falsch.

auf php seite wurde bereits optimiert programmiert. warum nicht auf asp seite?

zum thema mars. Ich hab es in diesem zusammenhang nur genutzt um mir zu ersparren ein Connection Pooling zu integrieren.

nun. in .net ist connectionpooling bereits integriert und du hast es sogar genutzt ohne es zu wissen.

do not use mars....

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

brrr... StopWatch.... das nimmt man für performancetests.

liest du was ich schreibe? welche sinn hätte stoppwatch gemacht. time() unter php lliefert mir die ergenisse nur in Sekunden(!) DateTime.Now in MS. Der fehler in diesem vergleich liegt in der PHP Funktion, weil sie im fehlerfall +/- Sekunde daneben liegt. Da kann mit die ungenauigkeit von +/- einer MS bei .NET mal gerade egal sein.

falsch bleibt falsch. egal ob das ins ergebniss einfließt. das problem ist, das du somit speicher frisst und das der garbagecollector irgendwann in tests unnötigerweise angeworfen wird, was das ergebniss beeinträchtigt.

ähm wenn du mir sagst wo ich unützt große elemente anlege, die Treffermänge von flights ändert sich ständig... um zu verhindern das irgendein caching optimierend eingreift.
ok ich hätte die variablendeklaration und den command/sqladapter außerhalb der schleife anlegen können ...

die umsetztung ist vom ablauf her 1:1. mehr angleichen ist fast nicht mehr möglich und das ist in meinen augen falsch.

auf php seite wurde bereits optimiert programmiert. warum nicht auf asp seite?

nenn mir eine zeile code die in PHP bei der verarbeitung für "optimiert" wurde.
das auslesen erfolgt in der art und weise wie ich die daten brauche um sie zum clienten zu bringen. oder anders gefragt für würdest du eine 5 * 1 zu N besser auflösen bzw optimieren

aber ein kleiner Tipp: zeil des testes 1 war die direkte vergleichbarkeit der laufzeiten und die macht nur sinn wenn beide produkte das gleiche ergebniss liefern

das was du willst hab ich im dritten Diagramm gemacht, weil es sich da anbot. Blos wie aussagekräftig ist so ein Vergleich?

nun. in .net ist connectionpooling bereits integriert und du hast es sogar genutzt ohne es zu wissen.

do not use mars....

ich weiß es schon, ich weiß auch das MARS nur in ganz bestimmten konstelation vorteile bringt ansonsten nachteile. ich war blos zu faul für einen test ala "lass mal schauen was da geht" ein kommplettes Connectionpooling aufzubauen... zumal sich mir der sinn nicht erschließt. 2 Kerne - einer für die .Net anwendung einer für die SQL server. wenn ich den anspruch eines proffesionellen, perfekten und allumfassenden .NET test gewollt hätte, hätt ich geld dafür verlangt 😁

für leute wie dich ist der bericht nichts, da du weit genug in der matarie drinn bist, eher für leute die noch überlegen ob sie .NET auch im privaten nutzen wollen und vorher wissen wollen, ob es sich lohnt

Gelöschter Account
vor 15 Jahren

ähm wenn du mir sagst wo ich unützt große elemente anlege, die Treffermänge von flights ändert sich ständig... um zu verhindern das irgendein caching optimierend eingreift.
ok ich hätte die variablendeklaration und den command/sqladapter außerhalb der schleife anlegen können ...

hm. du hast den garbagecollector noch nciht ganz verstanden.
glaube mir. es macht einen unterschied wie du die objekte handlest.

nenn mir eine zeile code die in PHP bei der verarbeitung für "optimiert" wurde.

da der php code laut vorgabe bereits im produktivem einsatz war nehme ich doch stark an das die wissensbasis beim php programmieren größer war als die beim asp.net entwickeln.

aber ein kleiner Tipp: zeil des testes 1 war die direkte vergleichbarkeit der laufzeiten und die macht nur sinn wenn beide produkte das gleiche ergebniss liefern

nun. das ergebniss muss nicht bei anderer implementierung abweichen.

ich weiß es schon, ich weiß auch das MARS nur in ganz bestimmten konstelation vorteile bringt ansonsten nachteile. ich war blos zu faul für einen test ala "lass mal schauen was da geht" ein kommplettes Connectionpooling aufzubauen...

dann hast du noch immer nciht verstanden, das du das nicht machen musst. man benutzt schon mit der zeile "new Connection" in .net gues und bewährtes connectionpooling. das muss man in keiner zeile selber machen.

für leute wie dich ist der bericht nichts, da du weit genug in der matarie drinn bist, eher für leute die noch überlegen ob sie .NET auch im privaten nutzen wollen und vorher wissen wollen, ob es sich lohnt

gerade für leute, die noch nciht wissen was sie nehmen sollen, ist es ncihts, da eine fehlerbehaftete beratung in meinen augen schlechter ist als garkeine beratung.

bitte verstehe mich nciht falsch. es ist kein angriff gegen dich. ich versuche nur objektiv diesen test zu beurteilen. wenn jemand noch unenschlossen ist und diese berichte ließt dann bekommt man zwangsläufig einen falschen eindruck und das möchte ich verhindern. sry wenn ich dich gekränkt habe. das war nciht meine absicht.

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

dann hast du noch immer nciht verstanden, das du das nicht machen musst. man benutzt schon mit der zeile "new Connection" in .net gues und bewährtes connectionpooling. das muss man in keiner zeile selber machen.

Korrekt. Jetzt muss ich mal fragen (hier fehlt mir schlicht die erfahrung) was ist recourcenhunriger. Innerhalb einer Foreachschleife, jedes mal ne Connection neu zu erzeugen oder MARS zu nutzen. Unter der gesichtspunkt, dass ich nicht den Datanbank zugriff paralelisieren will, sondern nur die Verarbeitung der gelesenen daten (wenn sie mal über den DataReader/Adapter gelesen wurden) will?

hm. du hast den garbagecollector noch nciht ganz verstanden.
glaube mir. es macht einen unterschied wie du die objekte handlest.

Ähm was willst du mir damit sagen? Ein Konkretes beispiel, so kann ich nur orakeln.

da der php code laut vorgabe bereits im produktivem einsatz war nehme ich doch stark an das die wissensbasis beim php programmieren größer war als die beim asp.net entwickeln.

Lies den Text nochmal. Ja das PHP system ist im Einsatz. Ja es wurde optimiert. Nein das betrifft nicht diese Codezeilen. Diese Codezeilen sind 4 einfache Foreach/While schleifen, die 4 1-n Beziehungen auflösen. Durch den einsatzt von Cache-Tabellen und Cache-Files wurde "optimiert" und so die Zugriffszeiten gedrückt.

nun. das ergebniss muss nicht bei anderer implementierung abweichen.

Nenn mir bitte mal eine konkrete andere implementierung um eine 4* 1-n auszulesen.

gerade für leute, die noch nciht wissen was sie nehmen sollen, ist es ncihts, da eine fehlerbehaftete beratung in meinen augen schlechter ist als garkeine beratung.

noch seh ich zwar nicht wo ich beratend tätig gewesen. Ich sage weder welche Technik eingesetzt werden soll noch sonst etwas. Ich sage nur was ich eingesetzt habe und was für zeiten bei rauskommen

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo Raptor 2101

Ich habe den Code kurz überflogen (ASP.NET), das ist mir aufgefallen:
Benutze keine statische Variabeln, bzw. nur wenn du weisst was du tust, siehe:

Sagt dir <Objekt>.Dispose() / .Close() und die Using-Anweisung was?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

Da bin ich erlich gesagt noch am testen. Die aktion mit der Datenbank als Static war eine "Quick&Dirty". Danke dennoch für den link 🙂

Gelöschter Account
vor 15 Jahren

du erzeugst nicht einfach nur die connection neu, du erzeugst alles neu in der schleife und das ist falsch. egal wie du es drehst.

noch seh ich zwar nicht wo ich beratend tätig gewesen. Ich sage weder welche Technik eingesetzt werden soll noch sonst etwas. Ich sage nur was ich eingesetzt habe und was für zeiten bei rauskommen

du triffst eine aussage mit diesem test. jeder, der vergleiche sucht (aus welchem grund auch immer), wird vermutlich auch diesem vergleich finden und bestimmt nicht den kompletten code lesen. er wird sich die ergebnisse ansehen und sich versuchen ein bild daraus zu machen. daher ist dieser beitrag in meinen augen schon als beratung zu sehen.

R
Raptor 2101 Themenstarter:in
119 Beiträge seit 2008
vor 15 Jahren

du erzeugst nicht einfach nur die connection neu, du erzeugst alles neu in der schleife und das ist falsch. egal wie du es drehst.

nochmal: das ist bewusst so gemacht, jeder durchlauf einer schleife soll einmal den seitenaufbau einer seite simulieren. Von 50 Flights bis 1050. jeder dieser schleifendurchläufe soll ein Ergebniss liefern welches unabhängig vom vorherigen oder nächsten durchlauf ist. Schlussendlich stellt es die Rqeustes von X usern nach, die alle zu unterschiedlichen Piloten die Flights abfragen. Daher wird für jeden Durchlauf ein eigenes XML Document, DataSet und SqlCommand-Object benötikt,

du triffst eine aussage mit diesem test. jeder, der vergleiche sucht (aus welchem grund auch immer), wird vermutlich auch diesem vergleich finden und bestimmt nicht den kompletten code lesen. er wird sich die ergebnisse ansehen und sich versuchen ein bild daraus zu machen. daher ist dieser beitrag in meinen augen schon als beratung zu sehen.

UNd genau deswegen hab ich an erster stell ins dokument geschrieben

Dieses Dokument erhebt nicht den
Anspruch eine solche umfassende Analyse zu bieten, es handelt sich nur um eine Analyse
die im Rahmen einer Entscheidungsfindung entstand.

Gelöschter Account
vor 15 Jahren

es handelt sich nur um eine Analyse
die im Rahmen einer Entscheidungsfindung entstand.

ja, du schreibst es ja selbst.

chlussendlich stellt es die Rqeustes von X usern nach,

nein das tut es in meinen augen nicht.

J
537 Beiträge seit 2007
vor 15 Jahren

Hallo Zusammen,

diese Diskussion hatten wir auf ASP.NET Zone schon:
Benchmark-Ergebnisse ASP (.NET) PHP Dankenbankgeschwindigkeiten