java vs php-benchmark
Ich bin ein php-Entwickler, aber in letzter Zeit schreiben musste, die gleiche Anwendung zweimal, einmal in php und einmal in java für eine Klasse nehme ich in der Schule. Aus Neugier habe ich einen benchmark auf die beiden und fand, dass die java-version wurde mit 2 bis 20-mal langsamer als die php-version, wenn die Datenbank zugegriffen wird, und 1-bis 10-mal langsamer ohne DB-Zugriff. Ich sehe zwei unmittelbare Möglichkeiten:
- Ich zu saugen java.
- Kann ich endlich sagen, die Menschen aufhören zu jammern über php.
Geschrieben ich mein servlet-code hier. Ich will keine nit-wählerisch jammern oder kleine Verbesserungen, aber kann jemand sehen, eine schreckliche eklatante performance-Problem gibt? Oder kann jemand erklären, warum Java-fühlt sich an wie es hat zu saugen?
Habe ich immer gehört, wie Leute sagen, dass java schneller und besser skalierbar als php, vor allem meinem Lehrer, er ist davon überzeugt, aber je mehr Anfragen gestellt werden, desto langsamer java bekommt. php scheint nicht betroffen zu sein, durch erhöhte Belastung, sondern konstant bleibt.
- PHP ist sehr schnell, aber Java ist ein Bytecode-kompilierte Sprache, also es ist von Natur aus schneller.
- Das ist, was ich sage. Alle im internet schwärmt, dass java ist sooooo viel schneller, aber auf meinem server es sucketh zu einem sehr hohen Grad im Vergleich zu php. Haben Sie Lesen die Frage?
- Eine Dritte Möglichkeit ist, dass man nicht die performance-Messungen richtig.
- Ich bitte die Seite mehrmals und sehen, wie lange es dauert. Ich weiß nicht, wie viel könnte schief gehen,.
- jeder den ich kenne sagt php ist schneller, es hängt davon ab, wer Sie sprechen zu\ hören
- Es ist ein großes problem in den Leistungs-Messungen, wie, dass; Lesen, auf "JVM " warmup". Auch, Ihre Java erstellt eine neue DB-Verbindung für jede Anforderung; Lesen, auf "JDBC connection pool".
- Es gibt andere Probleme mit Ihrer Java -, aber Sie haben gesagt, dass Sie nicht möchten, dass "nit-picking", damit ich nicht verschwenden mein Atem.
- In der Tat. Ein connection-pool eine Menge Fragen. Java ist ein bisschen mehr low-level als PHP. PHP nimmt viel Bösartigkeit von Ihren Händen, viel ist bereits optimiert, hinter den kulissen, aber in Java haben Sie mehr feinkörnige Kontrolle über diese selbst. Zu deinem code: das laden der JDBC-Treiber, der auf jede Verbindung von Aneignung ist unnötig. Tun Sie es einfach einmal während der Anwendung zu starten. Oh, Lesen/schreiben durch einen Puffer (BufferedReader/BufferedWriter) würde auch helfen, eine Menge.
- können wir Ihre PHP-code?
- Wenn Sie sagen, war Java 1-10x 2 20x langsamer - können Sie die Werte, die Sie bekam, einschließlich der Einheiten für PHP und Java? Ich möchte wissen, ob wir reden hier über Millisekunden oder Sekunden/Minuten.
- C (oder @BalusC), nicht mit einer Verbindung, die auf jede Anfrage, die den Unterschied gemacht. Er legte es über gleich php auf die Anforderungen mit der db ergibt sich, wenn Sie wollen, posten Sie Ihre Antwort als eine Antwort kann ich markieren Sie es als akzeptiert. @BalusC, ich habe eine schnelle Suche und konnte Sie nicht finden, keine Dokumentation für einen bufferedwriter, haben Sie eine Quelle, die konnte ich Forschung aus?
- BufferedWriter: download.oracle.com/javase/6/docs/api/java/io/...
- Ich stellte eine Antwort als "community-wiki", die kapselt die Antwort von @Stephan und @BalusC. Ich nicht bekommen Kredit für die Antwort also, wenn Sie möchten, können Sie akzeptieren und Bearbeiten.
- Es geht um zu zeigen, dass ein gut geschriebenes Programm in Ihrer Sprache wesentlich schneller als ein nicht so gut geschriebenes Programm, das in einer Sprache, die andere sagen, ist schneller. Es ist ein ähnliches argument mit Java vs C++ performance.
- Ich nur Messen in der Mikro-Sekunden in meinem Java-Anwendungen. 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
In eine ausgereifte Java-Webanwendung das Servlet würde die Verwendung einer bestehenden JDBC connection pool. Herstellen einer neuen Verbindung werden mit Abstand die größten Kosten bezahlen Sie in der Zeit.
Aufrufen
Class.forName
für jeden Versuch, die Verbindung wird auch dazu führen, eine unnötig verlangsamen.JVM-tuning könnte auch ein Faktor sein. In einer enterprise-Umgebung der JVM-Speicher und möglicherweise GC-Konfigurationen wäre angepasst und optimiert erreichen eine wünschenswerte balance zwischen Ansprechverhalten und Ausnutzung von Ressourcen.
Als Stephen C Punkte heraus, die JVM hat auch ein Konzept für eine Art "warm up".
Alles, was gesagt, ich habe keine Ahnung, wie PHP im Vergleich zu Java und fühle ich mich beiden Sprachen bieten große Lösungen zu trennen die nicht-disjunkten Gruppen von Bedürfnissen.
Basiert auf nicht viel info (wo auch die besten Entscheidungen getroffen werden), meine Vermutung ist, dass die
Class.forName("com.mysql.jdbc.Driver");
imgetConnection()
ist der große timesink.Erstellen einer
new String
im importFile, wenn diechar[]
übergeben werden kann, um aus.println ist mir Erbsenzählerei.Class.forName(...)
mehrmals für die gleiche Klasse name ist verschwenderisch, aber es ist nicht so teuer, wie Sie sich vorstellen können, und wahrscheinlich zu einem Engpass in diesem Fall. Eines der ersten Dinge, die der classloader nicht zu sehen ist, wenn es bereits die Klasse geladen. Wenn es, dann es gibt nur die zuvor geladenen Klasse.Ihre test widerzuspiegeln scheint anfängliche Aufwand mehr als steady-state-performance. Versuchen Sie das nicht-DB-tests mehrere Male in einer Schleife (so daß jeder test wold führen Sie den code mehrmals) und betrachten Sie die lineare Beziehung zwischen Laufzeit und Anzahl der Iterationen. Ich vermute, dass die inkrementelle Kosten für java ist geringer als die für php