Tausende Dinge, die in Java ab Version 1 behoben werden müssen: ein großartiges Interview mit Sergey Kuksenko von Oracle


Sergey Kuksenko ist ein Performance-Ingenieur, der Java bereits in Version 1.0 gesehen hat. Während dieser Zeit gelang es ihm, an der Entwicklung von Mobil-, Client-, Serveranwendungen und virtuellen Maschinen teilzunehmen. Seit 2005 beschäftigt sich Java mit Leistung und arbeitet derzeit bei Oracle an der Verbesserung der JDK-Leistung. Einer der beliebtesten Redner bei Joker und JPoint.


Dieser Habrapost ist ein großartiges Interview mit Sergey, das folgenden Themen gewidmet ist:


  • Leistungskult;
  • Wann und was muss optimiert werden, das anfängliche Design der Sprache und Bibliothek;
  • Vielversprechende Bereiche für die weitere Optimierung;
  • Wie man an der Entwicklung teilnimmt und was durch Optimierungen gebrochen werden kann;
  • Compiler-Tricks, Registerplatzierung;
  • Ist es möglich, eine Katze aus Hackfleisch zusammenzusetzen?
  • Wenn Tests an fünf aufeinander folgenden Tagen und anderen Haushaltsroutinen durchgeführt werden;
  • Wie man ein Performance Engineer wird;
  • Vorbereiten eines Berichts für den nächsten Joker.

Über den Produktivitätskult


Oleg: Sie sind unser alter Sprecher, und dies ist nicht unser erstes Interview. Sag mir ein wenig, wer bist du jetzt, was machst du?


Sergey: Ich bin genauso wie vor vielen Jahren und mache das Gleiche. Ich arbeite im Java Performance-Team und bin verantwortlich für die Leistung von Oracle Java-Maschinen, OpenJDK.


Oleg: Dann habe ich eine etwas trollige Frage: Hier sind Sie ein Performance-Ingenieur, und Ihre Berichte beziehen sich auf alle Arten von Performance. Denken Sie nicht, dass das Leistungsproblem etwas überbewertet ist? Jeder eilt mit ihr, aber ist das überhaupt notwendig?


Sergey: Das ist eine gute Frage. Es hängt alles vom anderen ab. Diese Art der Aufmerksamkeit des Publikums kann als übermäßig angesehen werden. Unternehmensproduktivität ist dagegen Geld.


Dies ist das echte Geld, das die Leute für Hardware ausgeben, für eine Art Cloud in Amazon. Wenn Sie Ihre Anfragen nicht schnell genug bearbeiten, verlieren Sie Kunden, verlieren Geld, verlieren alles andere. Daher ist die Leistungsanforderung natürlich immer da. Die Frage ist, wie wichtig es jeweils ist. Ich schweige über den Hochfrequenzhandel.


Oleg: Denkst du übrigens, Java ist dafür geeignet?


Sergey: Hattest du die Gelegenheit, eine Person wie Peter Lawrey zu treffen?


Oleg: Wer ist der CEO von Chronicle Software, den Entwicklern von OpenHFT?


Sergey: Dies ist ein sehr berühmter Freund aus London, der viel auf Konferenzen unterwegs ist. Sie arbeiten in Java im Hochfrequenzhandel, sie leben großartig.


Oleg: Tun sie das auf Java oder heißt es nativer Code von Java? Trotzdem gibt es einen Unterschied.


Sergey: Ich weiß es auf dieser Ebene nicht, er hat es nicht gesagt. Grundsätzlich kann auf Wunsch alles, was benötigt wird, in Java selbst erreicht werden.


Oleg: Interessant. Wenn Sie zum Beispiel eine Gemeinschaft von Pythonisten nehmen, dann haben sie einen viel weniger Produktivitätskult. Wie kommt es, dass genau das in unserer Gemeinde passiert? Vielleicht haben Sie mit Ihren Berichten den Leistungskult provoziert? Sie, Shipilev, Pangin, Ivanov und so weiter.


Sergey: Ich weiß nicht, wie es passiert ist. Der Produktivitätskult auf der russischen Konferenz ist viel höher als auf der amerikanischen. Vielleicht spiegelt dies das Publikum selbst wider. Bei uns wollen sich die Menschen mehr für die Produktivität engagieren, das ist für sie interessant. Und in Amerika wollen sie mehr für das tun, was sie mehr bezahlen. Aber das ist eine Hypothese, eine Vermutung. Es ist so passiert.



Wann und was muss optimiert werden


Oleg: Sie sagten, dass es immer noch eine Leistungsanfrage gibt. Ab wann müssen Sie über Leistung nachdenken? Wann schlägt der Donner ein?


Sergey: Dies ist eine allgemeine abstrakte Frage. Es ist besser, sich noch einmal Alexey Shipilevs Keynote von einer der vorherigen Konferenzen zuzuwenden , auf der er all dies gut genug gemalt hat.


Oleg: Ja, ich erinnere mich an die "Kurve des Namens Sh".


Sergey: Sie müssen sofort Leistung erbringen, aber je nach Level. Es ist nicht notwendig, sofort Benchmarks zu schreiben. Es ist zum Beispiel bekannt, dass die banale Einschränkung der API-Architekturstufe zwischen Set as a set und SortedSet uns bereits grundlegende algorithmische Einschränkungen auferlegt.


Wenn wir ein SortedSet in die API geschoben haben (obwohl niemand dieses sortierte benötigt) und es dann über unser gesamtes System verteilt ist, muss dieses Ding schmerzhaft und hart herausgezogen werden.


Die Frage beginnt auf der Ebene des Designs - dies ist eine Frage minimaler Einschränkungen. Es müssen die kleinstmöglichen Einschränkungen verwendet werden, damit Sie später damit spielen können. Als ich zum Beispiel verschiedene Teile von Java verdrehte, kamen mir extrem schlechte Worte in den Sinn. Ich möchte etwas mit einer der Basisklassen tun, kann aber nichts tun, da die API repariert ist, Sie sie nicht mehr ändern können und sie bereits ausgebrochen ist. Aber um einen Trick und ein Übertakten zu machen, müssen Sie einige Details verbergen.


Fallstudie: Ich habe mich in der Klasse java.math.BigDecimal herumgetrieben. Es gab eine große Bitte von verschiedenen Seiten, es irgendwie zu zerstreuen. Es gibt einen guten Sonderfall, wenn unser BigDecimal nicht „groß“ ist, sondern nur dezimal, und Sie müssen sie lesen.


Jetzt wurde natürlich ein passender Wrapper dafür hergestellt. Wenn jedoch kein öffentlicher Konstruktor aus BigDecimal herausragt, sondern einige statische Methoden und Fabriken, könnte man BigDecimal abstrakt machen und zwei verschiedene Implementierungen ausspucken, die nach Bedarf funktionieren. Dies ist jedoch unmöglich, da der Konstruktor hervorsteht. Aus diesem Grund müssen Sie bereits eine unnötige Laufzeitprüfung durchführen, die es Ihnen in einigen Fällen ermöglicht, einem schnellen Pfad zu folgen.


Oleg: Folgt daraus, dass es sich bei der Entwicklung einer Standardbibliothek lohnt, die Designer aufzugeben und überall Bauherren zu arbeiten?


Sergey: Es wird spät.


Oleg: Wenn es nicht zu spät wäre, wäre es eine gute Idee?


Sergey: Sie würde mehr Spielraum geben. Schauen Sie: Wir schreiben neu, und dieses neue steht außerhalb des Konstruktors. Es werden zwei Operationen erhalten: Zuerst erstellen wir ein Objekt, dann rufen wir den Konstruktor auf, der es füllt. Und manchmal wäre es sehr nützlich, die Erstellung des Objekts zu verbergen und das falsche Objekt zu erstellen, das wir draußen haben. Dies ist eine Sprachbeschränkung, das Original aus den frühen Tagen von Java.


Oleg: Nun, jetzt verwendet jeder DI-Frameworks, mit denen Sie Proxys nach Belieben drehen und hinzufügen können, wobei diese Einschränkung umgangen wird. Könnten Sie im ursprünglichen Design der Sprache so etwas wie den eingebauten Abhängigkeitsinjektionscontainer hinzufügen?


Sergey: Ich habe eine sehr spezifische Meinung über das ursprüngliche Design der Sprache. Wenn Sie sich an die Geschichte von Java 1.0 erinnern, kam es zu einem ziemlich starken Zeitdruck, alles musste schnell erledigt werden.


Es gibt Tausende von Dingen, die ich persönlich gerne von der ersten Version an behoben sehen würde. Aber ich befürchte, selbst wenn einer von tausend ausgewählt würde, eins, zwei, drei, und sie hätten zum Zeitpunkt des ersten Java begonnen, wäre Java nicht herausgekommen. Dies ist ein Standardbeispiel dafür, dass das Beste der Feind des Guten ist.



Was kann man sonst noch in Java optimieren?


Oleg: Normale Leute können nur in ihrem Projekt etwas reparieren, und Sie als Performance-Ingenieure bei JDK sind sofort von Hunderttausenden von Projekten betroffen. Es stellt sich die Frage: Gab es in mehr als 20 Jahren Java-Entwicklung Bereiche im JDK, in denen Eingriffe von Kerningenieuren zu spürbaren Auswirkungen führen können? Und wie auffällig ist dieser „spürbare Effekt“?


Sergey: Erstens funktioniert Java jetzt überhaupt nicht mehr auf der Hardware, die beispielsweise vor 10 Jahren verwendet wurde. Eisen jetzt und Eisen vor 10 Jahren sind zwei große Unterschiede, und es ist ratsam, verschiedene Optimierungen vorzunehmen.


Zweitens ist es natürlich wunderbar, wenn ein Performance-Ingenieur etwas sitzt und beschleunigt, große Zahlen erhält, seinen Vorgesetzten Bericht erstattet und nach diesen Übertaktungen Geld für einen Bonus ausschlägt. An neuen Projekten wird jedoch sehr viel gearbeitet. Eine Funktion wurde hinzugefügt, und die Aufgabe des Performance Engineers besteht nicht darin, die Funktion zu übertakten, sondern sicherzustellen, dass in dieser Funktion alles in Ordnung ist. Oder wenn nicht in Ordnung, dann überlegen Sie sich eine Korrektur.


Oleg: Wie kannst du sicher sein? Sie überprüfen den Code nicht formal. Was ist ein "sicherstellen"?


Sergey: Um sicherzustellen, dass unter dem Gesichtspunkt der Leistung alles in Ordnung ist, ist die subjektive Expertenmeinung eines Leistungsingenieurs, der einen Bericht schreibt und sagt, dass „in dieser Funktion alles normal ist“. Abhängig von der Größe des Features bedeutet dies manchmal ziemlich viel Action, manchmal viele verschiedene Anstrengungen. Ausgehend von der Tatsache, dass Sie nur dumm sitzen, beobachten müssen, was dort getan wird, diesen Bereich bewerten, Benchmarks fahren, sehen, was am Ausgang passiert, und eine vernünftige fundierte Entscheidung treffen müssen.


Oleg: Und unter dem Gesichtspunkt der Leistung und der neuen Funktionen - bewegt sich Java im Allgemeinen vorwärts? Gibt es da etwas? Weil sich an unserer Hardware nicht viel geändert hat, zum Beispiel wenn wir über Intel sprechen.


Sergey: Für welchen Zeitraum hat sich das nicht geändert?


Oleg: Zum Beispiel die letzten 10 Jahre.


Sergey: Ja, gibt es vor einem Jahrzehnt einen AVX-512 auf Hardware?


Oleg: Nein. Er ist wahrscheinlich nicht immer in der Moderne präsent?


Sergey: Das tue ich definitiv nicht. Wir haben es in unserem Labor, aber es ist alles von Compilern besetzt. Sie schrauben so weit, also habe ich nicht geschaut.


Oleg: Kann die Unterstützung von AVX-512 als Beispiel für eine typische Funktion angesehen werden?


Sergey: Wahrscheinlich möglich. Was genau mache ich? Wir haben viel darüber gearbeitet, dass es moderne Anforderungen für das Hinzufügen neuer kryptografischer Algorithmen gibt. Dies ist eine Sache, auf die sich zehn Jahre alte Kryptografiealgorithmen einfach nicht verlassen können. Wir brauchen neue Algorithmen, größere Schlüssel. Und die Hinzufügung neuer kryptografischer Algorithmen erfolgt, würde ich sagen, ständig.


Oleg: Beschleunigen sie irgendwie die Hardware?


Sergey: Es hängt alles von bestimmten Algorithmen ab. Es gibt sehr gut beschleunigte Algorithmen. Übrigens hätte dies vor 10 Jahren auf Intel-Hardware nicht funktioniert, aber ungefähr 5-6, wie gute Anweisungen erschienen, bis hin zu AES-Einheiten mit Beschleunigungen. All dies wurde mit einem minimalen Zeitintervall implementiert.


Oleg: Was ist mit der GPU? Können sie auch Matrizen multiplizieren?


Sergey: Über die GPU - ein separates Gespräch. Wir haben dafür ein Panama-Projekt, in dem all diese Arbeiten ausgeführt werden, und eines Tages wird es mit allen Extras die Java-Hauptlinie erreichen.


Oleg: Ich habe ein paar Bekannte, die sich bedingt mit Finanzmathematik beschäftigen. Ab einem bestimmten Zeitpunkt wechseln sie immer zu C ++, um zu rechnen, und behaupten, dass es sehr unpraktisch ist, all diese Optimierungen und Hardware von der verwalteten Plattform aus zu verwenden. Kann das verbessert werden?


Sergey: Wir haben auch eine große Anfrage dafür und es gibt eine Reihe interner Anforderungen. Zum Beispiel, damit etwas im Bereich des maschinellen Lernens besser funktioniert. Dies ist in der Regel eine banale Matrixmultiplikation, die auf der GPU abgeworfen werden kann. Die Arbeit daran ist noch nicht abgeschlossen.


Wir haben zwei große Dachprojekte: Valhalla und Panama, die Funktionen wie die GPU sammeln sollen. An der Kreuzung von Valhalla und Panama befindet sich eine Vektor-API, die mit unseren SIMD / SSE / AVX-Anweisungen direkt aus Java-Code zusammenarbeitet, und Valhalla selbst mit Inline-Typen ist ein großer Schritt in diese Richtung.



Was kann durch Optimierung gebrochen werden, wie kann man an der Entwicklung teilnehmen?


Oleg: Die Regenschirme, die Sie erwähnt haben, sind einander ähnlich. Ist es möglich, dass ein Projekt ein anderes beeinflusst, auch in Bezug auf Code und Leistungsprofil? Haben Sie zum Beispiel etwas umgestaltet, und der unglückliche Ron Presler, der Tränen einschenkt, repariert abends seine Tests in einer Ecke?


Sergey: Das passiert die ganze Zeit. Ein konkretes Beispiel ist die Vektor-API. Damit die Vektor-API gut funktioniert, müssen unsere nativen Vektoren schließlich zu Werttypen oder, wie es jetzt in Java genannt wird, zu Inline-Typen werden. Sie können eine Problemumgehung im Hotspot vornehmen und sie irgendwie implementieren, aber ich möchte eine allgemeine Lösung. Andererseits besteht das Hauptmerkmal von Inline-Typen darin, sich keine Gedanken über das Layout dieser Daten zu machen, und das Layout dieser Daten ist für die Vektor-API äußerst wichtig.


Weil es tatsächlich direkt dem AVX-512 und all dem entspricht. Es ist klar, dass Sie einige Kniebeugen und Optimierungen vornehmen müssen, die einerseits den Inline-Typ zu einem normalen Typ machen, aber ein hardwarebasiertes Layout haben. Natürlich treten Kreuzungen auf. Wenn Sie sich die Gruppen von Menschen ansehen, die Panama und Walhalla bewegen, schneiden sie mehr als die Hälfte.


Oleg: Rein organisatorisch, hier haben Sie ein Projekt, eine Art Leistungsproblem, aber es ist der Knotenpunkt mehrerer Projekte. Was ist als nächstes zu tun? Wie kann man das lösen? Es stellt sich heraus, dass dies bereits ein Kompromiss zwischen Projekten und Menschen ist und nicht zwischen einigen abstrakten Aufgaben.


Sergey: Hier ist alles sehr einfach: Wenn dies ein Leistungsproblem mit einer Funktion ist, die gerade entworfen wird, müssen Sie zu den Leuten gehen, die entwerfen, und sagen: „Also und so, was werden wir tun? Lass es uns anders machen. “ Die Diskussion beginnt und das Problem ist gelöst.


Wenn der Code bereits vorhanden ist, funktioniert er bereits. Im Idealfall beheben Sie dieses Problem, oder wenn Sie es nicht vollständig beheben können, platzen Sie den Prototyp heraus. Dann kommen Sie erneut zum Eigentümer des Codes und sagen: "Hier ist der Prototyp, was werden wir tun?" Außerdem lösen wir dieses Problem speziell für jeden Fall.


Oleg: Wir haben hier interessierte Leute, die nicht an diesem Prozess teilnehmen können, das sind Endbenutzer.


Sergey: Sie können nicht genau genug teilnehmen, um nicht für ihre Gehälter in Oracle bezahlt zu werden. Wenn Sie kein Gehalt benötigen, kommen Sie zu OpenJDK und nehmen Sie teil.


Oleg: Wie real ist es? OpenJDK hat einige verdammte Genies wie Sie, und wo gewöhnliche Leute sind und wo Sie sind. Nehmen wir an, etwas verlangsamt sich für mich, was soll ich tun und wie?


Sergey: Wenn Sie das Problem nicht kennen, ist dies eine separate Frage, ob jemand nach einer Lösung für Sie sucht. Dies ist eine Frage als Bereich, als Beispiel und so weiter. Auch wenn Sie das Problem nicht kennen, ist es vielleicht sinnvoll, in OpenJDK zu schreiben und zu fragen. Wenn dies etwas ist, das jemand sofort in den Kopf klickt, werden die Leute es ergreifen. Wenn es für niemanden von Interesse ist, bleibt es unbeantwortet.


Oleg: Angenommen, ich kenne das Problem und weiß sogar, was behoben werden muss.


Sergey: Wenn Sie das Problem kennen, kommen Sie zu OpenJDK, unterschreiben alle erforderlichen Zettel, bieten einen Patch an, der überarbeitet und gegossen wird.


Oleg: Ist das so einfach?


Sergey: Nun ja, ein bisschen Bürokratie, warte ein bisschen. Gestern hat Tagir ( Lany ) eine kleine Lösung gefunden, die ich aufgegeben habe. Er will nur zum Ende gebracht werden. Er fing an, sich selbst daran zu erinnern. Er sagt: "Verdammt, was ist los, ich habe alles getan, angelegt, niemand überprüft es." Nun ja, niemand überprüft. Es ist Juli, die Hälfte des Java-Büros ist im Urlaub. Sie werden aus dem Urlaub kommen und es tun.


Oleg: Urlaub in den USA sind ungefähr die gleichen Daten wie normalerweise in Russland?


Sergey: Nein, das Urlaubssystem in den USA ist völlig anders als in Russland. Erstens sind sie deutlich kleiner. Und auch in den USA ist das Feriensystem an Schulen gebunden. Wenn Sie Kinder im Urlaub haben - dann Ferien. Sobald die Feiertage beginnen, beginnt sich ganz Amerika zu bewegen. Und da der Unterricht hier Mitte Juni endet und Mitte August beginnt, ist dieses Urlaubsdelta nicht so groß - nur zwei Monate.



Compiler-Tricks, Platzierung registrieren


Oleg: Ist es jemals vorgekommen, dass Sie zu Hause etwas optimiert haben und danach Benutzer Code anders schreiben mussten? Relativ gesehen ändert dieses Refactoring die Art und Weise, wie Sie Code schreiben, wenn Sie einen Teilstring auswählen, der zum Einnehmen eines Bereichs verwendet wird, und jetzt eine vollständige Kopie erstellen.


Sergey: Sicher war es das, aber ich werde jetzt keine konkreten Beispiele nennen. Die Frage ist, was die Leute beim Schreiben von Code festlegen. Wenn sie die maximale Leistung herausholen müssen und dafür alle Arten von compilerspezifischen Tricks ausführen, sollten sie darauf vorbereitet sein, dass sich der Compiler im Laufe der Zeit weiterentwickelt, und sie müssen ihren Code ständig entsprechend dem aktuellen Status des Compilers ändern. Und das ist großartig.


Angenommen, nach 20 Jahren wird Graal plötzlich der Haupt-Compiler für HotSpot sein - dann müssen diese armen Kerle überhaupt alles neu schreiben. Dies geschieht nur, wenn Sie eine solche technische Aufgabe übernommen haben - Änderungen im Compiler zu verfolgen. Es ist viel einfacher, den richtigen Code ohne direkte Bindungen mit mehr oder weniger normalen allgemeinen Implementierungen zu schreiben.


Übrigens über Compiler - nicht nur über Java-Compiler, sondern allgemein. Es gibt Moores Gesetz, das kein Gesetz ist, sondern nur eine empirische Beobachtung, dass sich die Anzahl der Transistoren alle anderthalb Jahre verdoppelt.


Und es gibt genau das gleiche Gesetz ( Proebsting-Gesetz ), nach dem die Codeleistung ohne Änderung alle anderthalb bis zwei Jahre um 4 Prozent steigt. Diese 4 Prozent erhalten Endbenutzer kostenlos, allein durch die Entwicklung der Compiler. Keine Hardware, nämlich Compiler.


Oleg: Ich frage mich, woher diese Prozentsätze kommen. Ist das eine Art anfängliche Ineffizienz? Aber dann wird dieser Bestand an Ineffizienzen eines Tages enden.


Sergey: Nein, es ist nur eine Frage der Technologieentwicklung. Ich habe Compiler beendet, als ich anfing, an der Leistung zu arbeiten. Aber als ich verlobt war, wurde die größte Entdeckung für mich 2005 oder 2006 gemacht. Ich habe 2008 überhaupt davon erfahren, weil ich den Artikel nicht rechtzeitig gelesen habe.


Eine sehr wichtige Aufgabe jeder Codegenerierung ist die Registerzuordnung. Es ist bekannt, dass dieses Problem im Allgemeinen NP-vollständig ist. Es ist sehr schwierig, es zu lösen, und daher versuchen alle Compiler, einen ungefähren Algorithmus mit unterschiedlichen Qualitätsgraden zu betreiben.


Und hier kommt ein Artikel, in dem die Jungs beweisen, dass in einigen Fällen, die eine große Anzahl von Compilern und eine große Anzahl von internen Darstellungen mit bestimmten Einschränkungen abdecken, ein exakter Polynomalgorithmus für die Aufgabe der Zuweisung der Registerzuordnung existiert. Hurra, lass uns gehen!


Dies geschah im Jahr 2005, früher erstellte Compiler wussten dies nicht.


Oleg: Jetzt können Sie einen neuen Allokator für Java erstellen?


Sergey: Jetzt, wo es eine theoretische Lösung gibt, kann sie umgeschrieben werden. Ich habe nicht auf Details eingegangen, aber ich weiß, dass die Jungs von Excelsior den Algorithmus implementiert haben.


Oleg: Wir haben kürzlich ein Interview mit Cliff Click geführt und er hat über den wahnsinnig komplexen und wahnsinnigen Genie-Allokator gesprochen, den er für Java geschrieben hat. Willst du nicht noch einen schreiben?


Sergey: Nein.


Oleg: Gibt es etwas Normales?


Sergey: Nein, er ist nicht normal. Aus meiner utilitaristischen Sicht werde ich sagen, dass ich in Assembler schaue und manchmal sehe ich: "Nun ja, hier sind die Register schlecht geworden." Wenn ich unsere Compiler kicke und wir den Allokator neu schreiben, was bekommen wir dann? Wir werden einen gewissen Gewinn erzielen, aber es ist unwahrscheinlich, dass ich ihn sehe, außer bei den Beispielen, bei denen ich die ineffiziente Zuweisung von Registern gesehen habe. Solange es in diesem Bereich keine großen Fehler gibt, gibt es immer etwas zu tun und mehr Gewinne zu erzielen.


Oleg: Gibt es im JDK Arbeitsbereiche, in denen der gesamte Motorraum-Compiler oder die Leistungsmagie an die Oberfläche bricht? Sie sagen, dass Sie normalen Code schreiben müssen und alles in Ordnung ist, aber es klingt verdächtig.


Sergey: Alles wird gut, bis du einen Super Duper brauchst. Wenn Sie es wirklich schnell brauchen, schreiben Sie es immer neu. Im Moment spielt eine abstrakte große Anwendung im Großen und Ganzen, wie sie geschrieben steht, im Allgemeinen keine Rolle für die Leistung.


Einerseits verbraucht der Garbage Collector, sobald er ausgelöst wird, seine 10-20%, andererseits beginnt die Anwendungsarchitektur zu erscheinen. Das große Problem, das ich im Haufen von Anwendungen gesehen habe, ist, dass sie Daten verschieben. Wir haben die Daten von hier genommen, dorthin übertragen und dort einige Transformationen vorgenommen. Im Allgemeinen macht jedes Programm genau das. Es überträgt Daten auf irgendeine Weise von einem Ort zum anderen. Wenn Sie jedoch zu viele Schichten im Programm haben, hilft der Compiler nicht weiter.


Oleg: Sie können versuchen, einige einfache Dinge zu verfolgen, wie zum Beispiel: Dieses Erinnerungsstück wechselt den Besitzer und bewegt sich zwischen Objekten in diese Richtung.


Sergey: Nein, das ist ein Designproblem. Aber ich verschiebe nicht nur, sondern verschiebe mit Modifikationen, ich mache etwas mit ihnen. Der größte Vorteil bei realen, massiven Anwendungen kann erzielt werden, wenn Sie darüber nachdenken: Ist so viel Verschiebung erforderlich? Statt zehn ist es schon gut, sieben zu machen.




(Es könnte den Anschein haben, dass dasselbe Video hier versehentlich dupliziert wurde. Tatsächlich ist alles einfacher, Habr hat das falsche Bild von YouTube zwischengespeichert.)


Wir sammeln eine Katze aus Hackfleisch


Oleg: Wir hatten gerade eine Hydra-Konferenz über verteiltes Rechnen. Und so viele Menschen beschäftigen sich sehr mit Dingen wie einem Kostenmodell, das die Kosten jeder Operation bestimmt - sehr detailliert, sehr genau. Die Leute wollen wirklich alle Anweisungen aufschreiben, die Kosten für jede von ihnen addieren und sehen, wie viele Balken Ihr Code benötigt. Ich frage mich, wie dieser Ansatz in der modernen Realität funktioniert. , ?


: , . , . , . , . , , , . ?


: : « ».


: , . , . , ? . — , . , , - , .


: , ?


: , ? , . ?


: , - ?


: , — , . - . ? , , , , . , .


: .


: , 1 . , , . , - , - .




performance-


: OpenJDK . ? C++ . — -?


: , , . . OpenJDK 15 . 15 .


: , , . .


: ! , , . , , , , , . , . : , , ( , ), — . , , .


: , ?


: , , Java.


: ?


: , , Valhalla.


: - , , — , ? ? .


: , . — . , , , . , , . . 2-3 , , , , — , .


, , inline-, Java Joker. . , Java- , runtime-. red flag: runtime- 0. ? , out of order- — .


, . , . ? . . baseline, , 5-6 , — . , , - 2 — - . 3% - , . 3% ?


: , ?


: , . performance-, . , , — .


, , . performance- — , - performance- - , . , , .


, , , , performance- — class libraries hotspot, .



«» performance


: , - performance-, . , , ?


: . ? , performance- performance-.


, : , , Oracle, Twitter, Netflix , - . , — . , performance- , .


- , , performance- , ? , , .


, performance- — . : - performance review, , , , , . — performance .


: « , ...», , — . , - — , , , .


Joker


: Joker . ?


: inline-, .


: , value-?


: , , . . , . value Java- . value, value, by value, - by value, value type. , .


. , , , Rémi Forax - , inline-. , , Kotlin inline- , value- Java, .


. value-, , , mvt (minimum value types), LW 1. LW 2 — , . , , , . , , , , performance- , , , , .


: , - -?


: , - . , , , , invokedynamic .


: , , , , .


: , , , . — , , . , ?


: , , , .


: . , , inline- generic- , inline-. , .


: , - ?


: : inline- LW2 . value-, generic, .


« Java -? Valhalla» Joker , - 25-26 2019 . , .

Source: https://habr.com/ru/post/de463455/


All Articles