Einloggen
[c] [meta] [fefe]

/c/ – Pufferüberlauf


Antwort erstellen

(≤ 4)



[Zurück]

  • [l] Felix Tue, 14 Jan 2025 15:40:33 GMT Nr. 145230
    PNG 810×456 134.8k
    JPG 1920×2560 694.8k
    Feuerfuchs hat das Speicherleck gefunden und fixiert.
    Schuld war die gute Müllabfuhr garbage collection, hätte uns doch nur jemand vor Müllabführ gewarnt.

    https://bugzilla.mozilla.org/show_bug.cgi?id=1913404
    https://bugzilla.mozilla.org/show_bug.cgi?id=1931717
    https://bugzilla.mozilla.org/show_bug.cgi?id=1935456
    https://bugzilla.mozilla.org/show_bug.cgi?id=1939295#c16
    https://hg.mozilla.org/releases/mozilla-release/rev/ea241be5664d

    Fixierung ist in 134.0.1 drin:
    https://ftp.mozilla.org/pub/firefox/releases/134.0.1/
  • [l] Felix Tue, 14 Jan 2025 16:09:07 GMT Nr. 145231
    JPG 563×442 33.4k
    >Feuerfuchs hat das Speicherleck gefunden und fixiert.
    >Schuld war die gute Müllabfuhr garbage collection
    Nein! Doch! Oh!
  • [l] Felix Wed, 15 Jan 2025 20:23:15 GMT Nr. 145337
    PNG 600×629 426.5k
    Problem war wohl eher, dass nicht genug Sozialismus Müllabfuhr drin war. Hätte man die von vornherein verwendet, anstatt seine eigene fehlerbehaftete drumherum zu zimmern, hätte man dieses Problem gar nicht gehabt.
  • [l] Felix Wed, 15 Jan 2025 20:47:07 GMT Nr. 145340
    >>145337
    Naja, sie müssen eben einen Javascript-Interpretierer mit Müllabfuhr implementieren, das ist deren Aufgabe. Und wenn man den Javascript-Interpretierer in einer Programmiersprache mit Müllabfuhr implementieren würde, müsste jemand den Kompilierer mit Müllabfuhrunterstützung für diese Programmiersprache implementieren, wo dann ebenfalls Fehler mit der Müllabfuhr lauern könnten. Damit verschiebt man das Problem nur, es ist Müllabfuhr den ganzen weg runter.
  • [l] Felix Thu, 16 Jan 2025 03:04:46 GMT Nr. 145353
    >>145340
    Dort unten würde die Müllabfuhr aber deutlich mehr Zeit und Arbeit abbekomben.
  • [l] Felix Thu, 16 Jan 2025 14:33:38 GMT Nr. 145370
    >>145353
    Jetzt mal realistisch gesehen: Wenn Mozilla so eine müllabführende Programmiersprache entwickelt, wird dadurch der bisher schon dünne Personalbestand an Entwicklern nur noch dünner.

    Welche real existierende müllabführende Programmiersprache bietet überhaupt
    *Performanz auf dem Niveau von C/C++
    *Man muss die Müllabführ zeitweise unterbinden, zeitlich selber auslösen, und jederzeit beim Laufen unterbrechen können (sonst Brauser-Jank)
    ?
  • [l] Felix Thu, 16 Jan 2025 21:29:20 GMT Nr. 145418
    wat?
    > Müllabfuhr
    damit hatte Felix schon vong Ewigkeit her ein Problem. Auf'm Schoßauf war die nie so richtig zugange; regelmäßiger Neustart erforderlich.

    War aber auch so'n Frickelschoßauf mit vong eigentlcih für Fenster, aber irgendwie Penguin draufgeklatscht.
  • [l] Felix Fri, 17 Jan 2025 15:24:54 GMT Nr. 145452
    >>145370
    >*Performanz auf dem Niveau von C/C++
    Das ist eher eine Kompiler- bzw. Implementationsfrage statt einer Sprachfrage; C++ hatte früher mal den Ruf, arschlahm zu sein. SBCL (Common Lisp) ist mit Typdeklarationen z.B. heute schon gut im Rennen.

    >*Man muss die Müllabführ zeitweise unterbinden, zeitlich selber auslösen, und jederzeit beim Laufen unterbrechen können (sonst Brauser-Jank)
    Die Anforderung ist kompletter Unsinn. Sind in Felixens Welt alle Müllabfuhren seriell und halten die Welt an?
  • [l] Felix Fri, 17 Jan 2025 15:38:50 GMT Nr. 145456
    >>145452
    Die Lösung ist natürlich verteiltes Echtzeit-Java!
  • [l] Felix Fri, 17 Jan 2025 20:57:46 GMT Nr. 145492
    >>145452
    >Das ist eher eine Kompiler- bzw. Implementationsfrage
    Naja, da steht schon "real existierend", was sich auf eine Implementierung beziehen sollte.
    Bei C/C++: Gibt nur 3 in Frage kommende Implementierungen, und zwar ähnlich gute Implementierungen.
    Bei müllabführenden Sprachen: Gibt in der Regel (C#, Java, JavaScript) einen Platzhirsch, ansonsten nehme die dir genehme Implementierung.
    Wobei die Implementierung natürlich egal ist, weil alle Müllabfuhr-basierten Sprachen, in egal welcher Implementierung, huntslahmer Müll sind (nicht ganz ernst gemeint, oder doch?)

    >SBCL ist mit Typdeklarationen z.B. heute schon gut im Rennen.
    Ich mag das Bankmarken-Spiel nicht, aber da ist SBCL ungefähr Faktor 5x lahmer, was für eine JavaScript-Maschine den absoluten Tod bedeuten würde (bei JavaScript-Maschinen wird darum gekämpft, wer 5-10 % schneller als die JavaScript-Konkurrenz ist).
    https://benchmarksgame-team.pages.debian.net/benchmarksgame/box-plot-summary-charts.html

    >Die Anforderung ist kompletter Unsinn. Sind in Felixens Welt alle Müllabfuhren seriell und halten die Welt an?
    Genau das war ja beim Käfer der Fall. Wenn man den Brauserinhalt gescrollt hat, ist buchstäblich ein Streifen vom Bildausschnitt mit Fensterhintergrundfarbe gefüllt worden, und erst nach dem Ende der Müllabfuhr, 7 Sekunden später, wurde der Bildinhalt gerendert und ging es weiter. Das hängt auch damit zusammen, dass JavaScript einzelfadig ist - wenn der eine, einzige JavaScript-Faden stoppt, ist auch die Seite eingefroren.

    >Currently, all modern engines ship a mark-and-sweep garbage collector. All improvements made in the field of JavaScript garbage collection (generational/incremental/concurrent/parallel garbage collection) over the last few years are implementation improvements of this algorithm, but not improvements over the garbage collection algorithm itself nor its reduction of the definition of when "an object is no longer needed".
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_management

    So, und nun die Frage: Wenn der JavaScript-Faden gerade läuft, wie soll man währenddessen von einem anderen Faden auf die Objekte in der JavaScript-Maschine zugreifen, während die Maschine gerade ausgeführt wird und diese Objekte manipuliert und neue Objekte erstellt/die Referenzen zwischen diesen Objekten umbiegt? Genau, dafür braucht man entweder einen Globalen-Interpretierer-Lock (CPython) oder feingranulare Locks/Mutexe, die bei jeder solchen Stelle im JavaScript-Interpretierer den Interpretierer sperren. Und sperren bedeutet Jank.

    Weiteres Problem: Die Müllabfuhr muss ja auf irgendeinem Faden laufen (Endgegner: System hat nur 1 Kern), und wenn alle Fäden bereits vom Brauser belegt sind, und die Müllabfuhr laufen soll, muss einer der anderen Fäden anhalten. Dann stoppt hoffentlich nicht der aktuelle Tab, weil der ja gerade in Benutzung ist. Aber hoffentlich auch kein Hintergrundtab, in dem gerade ein DuRöhre-Video abgespielt wird, und dann die Musik stoppt, wenn die Müllabfuhr zu lange dauert und die JavaScript-Engine nicht mehr die Audio-API füttert. Jedenfalls hat C# extreme Probleme mit Müllabfuhr, wie man bei Unity sieht, und die müssen große Klimmzüge unternehmen, um die Müllabfuhr und den damit einhergehenden Jank/Spikes zu umgehen:
    https://embrace.io/blog/garbage-collector-spikes-unity/
    In Unity sind ~5 ms bereits eine inakzeptable Zeit für die Müllabfuhr, weil das länger als ein ganzer Frame auf einem guten Monitor ist. Ein Brauser soll aber so flüssig wie eine Spiele-Maschine laufen. Lösung in Unity ist natürlich, native Allokationen und Deallokationen, die die Müllabfuhr nicht sieht, zu benutzen. Also diesbezüglich keine Müllabfuhr zu benutzen.

    >Welche real existierende müllabführende Programmiersprache bietet überhaupt [...]?
    Aber ich entnehme deiner Antwort, dass es aktuell keine hier verwendbare Programmiersprache dafür gibt.
  • [l] Felix Sat, 18 Jan 2025 06:41:26 GMT Nr. 145517
    >>145492
    >Naja, da steht schon "real existierend", was sich auf eine Implementierung beziehen sollte.
    Es ging Felix darum, dass z.B. Schedulierung und Vektorisierung am oberen Ende einen verdammt großen Teil ausmachen und die Fachleute für sowas aus offensichtlichen Gründen eher an GCC, Clang/LLVM und MSVC arbeiten statt an irgendeiner Sprachimplementation mit geringerem "Wirkungsgrad". Große Verbesserungen sind da oft überraschend schnell zu erreichen, sodass "Performanz von X" nicht so viel heißt, wie man vielleicht denkt. Gilt auch am unteren Ende, siehe z.B. CPython/PyPy.

    >Ich mag das Bankmarken-Spiel nicht, aber da ist SBCL ungefähr Faktor 5x lahmer
    Felix ist mal durch die g++/SBCL-Vergleiche gegangen:
    >k-nucleotide (4.36x)
    Eigene Haschischtabelle implementieren ist haram, aber den halben Kot dafür verwenden, eine sonst nutzlose Haschischfunktion zu implementieren, ist okeh. Felix hat das mal lokal auf seinem Vor-AVX2-Rechner probiert und kam auf Faktor 2.05x, was für bessere Autovektorisierung spricht, aber der CL-Kot ist eine grottenschlechte Übersetzung aus dem Javanischen, sodass da wahrscheinlich auch was zu holen ist.
    >fasta (5.74x)
    g++-Programm hat Mehrfadierung und SIMD-Intrinsiken, SBCL-Programm nicht. Nimmt man das schnellste g++-Programm ohne diese Tricks und behebt den peinlichen Performanztöter im RNG des SBCL-Programms (Konstanten nicht als Konstanten deklariert und Funktion nicht einlinierbar), kommt man auf 1.24x.
    >reverse-complement (0.84x)
    Die Bankmarke ist so vernachlässigt, dass das schnellste GCC-Programm fast sieben mal schneller als das schnellste g++-Programm ist. Spricht Bände. Das schnellste vergleichbare GCC-Programm kriegt Faktor 3.57x hin, aber der CL-Kot ist auch hier ziemlich fragwürdig.
    >binary-trees (3.09x)
    Das ist eine Müllabfuhr-Bankmarke, bei der Aufmotzen GC-Tuning verboten und explizite Speicherpools erlaubt sind. Weil das noch nicht sinnlos genug ist, müssen Speicherpools natürlich auch aus einer Bibliothek kommen; wenig überraschender Weise gibt es diese hauptsächlich für Sprachen ohne Müllabfuhr. Keine Ahnung, was man saufen muss, um sich solche Messkriterien auszudenken.
    >pidigits (4.68x)
    Ein Dutzend Sprachen kämpft darum, welche am besten GMP einbetten kann. Gewinner sind Sprachen mit miserablem Zahlenturm, weil dies ihnen die Lizenz gibt, GMP explizit als Bibliothek mit minimalem Überkopf zu benutzen.
    >regex-redux (12.19x)
    Vergleicht PCRE2 mit CL-PPCRE und hat daher nichts mit den Sprachen zu tun. CL-PPCRE ist zwar beliebt, aber nicht gerade für Performanz bekannt. C++ hat eingebautes Regex, aber das ist so arschlahm, dass kein einziges eingereichtes Programm auch nur versucht, es zu benutzen. Letzteres kann Felix ehrlich gesagt nicht kritisieren.
    >fannkuch-redux (1.20x), n-body (1.52x), spectral-norm (0.95x), mandelbrot (1.78x)
    Ist Felixens Erfahrung nach realistisch. Er schließt dennoch nicht aus, dass auch die Vergleiche schwachsinnig sind und bloß zufällig in der richtigen Größenordnung landen.

    Das Bankmarken-Spiel ist ein Fach übelster Datenmüll, und die Zusammenfassungen sind noch schlimmer. Der Schaden, den Isaac Gouy mit diesem Mist angerichtet hat und weiterhin anrichtet, ist unglaublich.

    >Genau das war ja beim Käfer der Fall.
    Nein, das Problem war, dass bestimmte Dinge fälschlicherweise von der Müllabfuhr ausgenommen waren und sich dann anstauten.

    >Jedenfalls hat C# extreme Probleme mit Müllabfuhr, wie man bei Unity sieht, und die müssen große Klimmzüge unternehmen, um die Müllabfuhr und den damit einhergehenden Jank/Spikes zu umgehen
    Das ist ein notorisches Unity-Problem. Unity benutzt(e?) aus Lizenzgründen die Boehms-Müllabfuhr, welche langsam ist, weil sie als malloc/free-Ersatz konzipiert wurde und davon enorm eingeschränkt wird. Viele Müllabfuhren erhöhen z.B. die Kosten von Zeigerzuweisungen minimal, um die Sammelphase (und damit u.a. Unterbrechungen) massiv zu beschleunigen; das alles ist mit Boehms nicht möglich.

    >So, und nun die Frage: Wenn der JavaScript-Faden gerade läuft, wie soll man währenddessen von einem anderen Faden auf die Objekte in der JavaScript-Maschine zugreifen, während die Maschine gerade ausgeführt wird und diese Objekte manipuliert und neue Objekte erstellt/die Referenzen zwischen diesen Objekten umbiegt? Genau, dafür braucht man entweder einen Globalen-Interpretierer-Lock (CPython) oder feingranulare Locks/Mutexe, die bei jeder solchen Stelle im JavaScript-Interpretierer den Interpretierer sperren. Und sperren bedeutet Jank.
    Felix würde darauf gerne kompakt antworten, aber dein Bild von Müllabfuhr ist so vereinfacht, dass das schwierig ist. Daher muss es beim schnippischen "lies ein Buch" bleiben; Felix empfiehlt The GC Handbook, dessen Raubmordkopie für diesen Kanal leider zu groß ist.
  • [l] Felix Sat, 18 Jan 2025 13:30:32 GMT Nr. 145543
    >>145517
    >>>Sind in Felixens Welt alle Müllabfuhren seriell und halten die Welt an?
    >>Genau das war ja beim Käfer der Fall.
    >Nein, das Problem war, dass bestimmte Dinge fälschlicherweise von der Müllabfuhr ausgenommen waren und sich dann anstauten.
    Aber selbst dann würde nicht stottern, wenn es parallel wäre und die Welt nicht anhalten würde. Da es stotterte, gab es einen seriellen Teil, der alles blockiert.
    Die Profile zeigten, dass es Spikes von der Müllabfuhr waren, mit Aufrufstapel in der Müllabfuhr.

    >>fannkuch-redux (1.20x), n-body (1.52x), spectral-norm (0.95x), mandelbrot (1.78x)
    >Ist Felixens Erfahrung nach realistisch. Er schließt dennoch nicht aus, dass auch die Vergleiche schwachsinnig sind und bloß zufällig in der richtigen Größenordnung landen.
    Das Problem ist, dass das bereits zu langsam für eine JavaScript-Maschine ist, wenn bei V8 um jede Mikrosekunde gefeilscht wird.

    Gibt es überhaupt eine einzige weit verbreitete Programmiersprache/Implementierung, die nicht eine "stoppe die Welt"-Phase hat?

    >Das ist ein notorisches Unity-Problem.
    Wenn ich mir C# allgemein anschaue (Jahr 2017):
    >Above, we see GC was triggered by thread 2948 and it waits for the CLR to suspend all managed threads.
    https://devblogs.microsoft.com/premier-developer/understanding-different-gc-modes-with-concurrency-visualizer/
    Das sieht nach dem Gegenteil von voll-paralleler Müllabfuhr aus.

    >Daher muss es beim schnippischen "lies ein Buch" bleiben; Felix empfiehlt The GC Handbook, dessen Raubmordkopie für diesen Kanal leider zu groß ist.
    Danke für den Buchtipp, Felix wird es sich mal anschauen.

    Darüber hinaus gibt es aber noch das Problem der Sprachbarriere. Es geht hier darum, mit Programmiersprache X eine JavaScript-Maschine (und deren Anbindungen ans DOM) zu schreiben. Wenn man den Fall hat, dass X eine Müllabfuhr hat, dann geht es hier um die Idee, dass man diese Müllabfuhr auch für das, was in der JavaScript-Maschine ausgeführt wird, verwendet (und zwar die gleiche Müllabfuhr-Instanz in und außerhalb der Maschine, wegen Abhängigkeit zwischen DOM/dahinterhängenden JS-APIs und dem Kot in der JavaScript-Maschine). Eine JavaScript-Maschine muss Maschinenkot jitten (siehe Performanz oben). Wie soll der gejittete Maschinenkot die Müllabfuhr von Programmiersprache X aufrufen? Dafür muss in der Programmiersprache X selbst es Funktionalität geben, mit der man die Müllabfuhr des eigenen Programms steuern kann, aber hoffentlich ohne explizite Allokationen/Deallokationen, sonst ist man wieder an der gleichen Stelle wie ohne Müllabfuhr.
  • [l] Felix Sat, 18 Jan 2025 17:37:29 GMT Nr. 145563
    >>145543
    >Die Profile zeigten, dass es Spikes von der Müllabfuhr waren, mit Aufrufstapel in der Müllabfuhr.
    FF hat zwei GCs: Einen klassischen für JS (GC im Profil) und einen referenzzählerbasierten für C++ (CC im Profil, für Cycle Collector, weil Referenzzähler ohne sowas nicht alles behandeln können). Das hausgemachte Referenzzählergefrickel hat dann gefefelt [0] und tote Zyklen nicht als tot erkannt, diese aber später immer wieder gescannt. Hätte die C++-Seite einen vernünftigen GC, wäre das gar nicht erst passiert.

    >Das Problem ist, dass das bereits zu langsam für eine JavaScript-Maschine ist, wenn bei V8 um jede Mikrosekunde gefeilscht wird.
    V8 ist viel zu komplex, als dass es um jede Mikrosekunde feilschen könnte. Die Unterschiede aus dem Bankmarken-Spiel sind im Bereich der zuvorgenannten Compilerarbeit: Felix hatte z.B. vor kurzem aus C übersetzten CL-Kot gesehen, der in einer neuen SBCL-Version plötzlich 1.5x schneller lief, ein Fach weil einige der Optimierungen aus GCC und Co. nun auch in SBCL gelandet sind.

    >Das sieht nach dem Gegenteil von voll-paralleler Müllabfuhr aus.
    Ist aber nicht der Grund, warum Unity ruckelt. Das liegt am (insb. nicht-inkrementellen) Boehm-GC und eventueller Inderey.

    >Gibt es überhaupt eine einzige weit verbreitete Programmiersprache/Implementierung, die nicht eine "stoppe die Welt"-Phase hat?
    Komplett ohne Unterbrechung, egal wie klein? Azuls Implementation der JVM hat sowas, heißt C4 [1]. Ist proprietär und kostet, weil kaum einer einen wirklich pausenlosen GC braucht, und die, die ihn brauchen, dafür zahlen. OpenJDK hat ansonsten z.B. Shenandoah [2], welcher üblicherweise Pausen im niedrigen einstelligen Millisekundenbereich hat. Man bemerke auch die Heap-Größen. SBCL hatte vor ein zwei Jahren auch sowas im Anmarsch, aber Felix weiß nicht, wie der Stand da gerade ist. Anmerkung nebenbei: Latenz ist nicht alles. Kürzere Pausen bedeuten praktisch immer niedrigeren Durchsatz, was für sehr viele Programme viel relevanter ist.

    >Wie soll der gejittete Maschinenkot die Müllabfuhr von Programmiersprache X aufrufen?
    CL hat Laufzeitkompilierung von Kot als Standardfeature, es genügt also, den Kot in optimiertes CL zu übersetzen:
    * (disassemble (compile nil '(lambda (x y z) (declare (optimize (speed 3) (debug 0)) (type (unsigned-byte 32) x y z)) (+ x y z))))
    ; disassembly for (LAMBDA (X Y Z))
    ; Size: 13 bytes. Origin: #xB800B4A2EF                        ; (LAMBDA (X Y Z))
    ; EF:       488D0C3A         LEA RCX, [RDX+RDI]
    ; F3:       488D1431         LEA RDX, [RCX+RSI]
    ; F7:       C9               LEAVE
    ; F8:       F8               CLC
    ; F9:       C3               RET
    ; FA:       CC0F             INT3 15                          ; Invalid argument count trap
    NIL

    Die Definition der Funktion ist hier eine Konstante, aber die kann auch zur Laufzeit berechnet werden.

    [0] https://bugzilla.mozilla.org/show_bug.cgi?id=1939295#c18
    [1] https://docs.azul.com/prime/c4-garbage-collection
    [2] https://wiki.openjdk.org/display/shenandoah/Main
  • [l] Felix Sat, 18 Jan 2025 18:00:29 GMT Nr. 145565
    >>145563
    >und einen referenzzählerbasierten für C++
    Igitt, das wusste Felix gar nicht. GC in C++ ist absolut haram! Inkscape nutzt auch sowas. Scheußlich und wahrscheinlich der Grund, warum es ständig crasht.
  • [l] Felix Sun, 19 Jan 2025 21:36:01 GMT Nr. 145661
    PNG 1920×1080 1.3M
    >>145563
    >Das hausgemachte Referenzzählergefrickel hat dann gefefelt [0] und tote Zyklen nicht als tot erkannt, diese aber später immer wieder gescannt. Hätte die C++-Seite einen vernünftigen GC, wäre das gar nicht erst passiert.
    Naja, die C++-Seite hatte damit ja eine Müllabfuhr, welche nicht seriell ist. Deswegen war der Einwand, dass die Müllabfuhr in Firefox seriell ist/einen blockierenden Teil hat, schon richtig. Wenn die Müllabfuhr viel scannen muss (was eben auch im normalen Betrieb passieren kann, nur eben in kleinerem Maßstab), hält die Welt an.

    >V8 ist viel zu komplex, als dass es um jede Mikrosekunde feilschen könnte.
    Was soll das heißen? Das ist Flinte-ins-Korn-Schmeißen ("Performanz kriegen wir sowieso nicht hin") oder Performanzignoranz ("Performanz ist doch gar nicht wichtig").

    Natürlich geht es auch bei V8 um Mikrosekunden, und zwar buchstäblich in den Bankmarken. Z.B. wenn man g++/glibc mit V8/Node.js vergleicht.
    Den Problemen aus dem Bankmarken-Spiel haben sich auch andere angenommen:
    >This is in contrast to other projects such as the Computer Language Benchmark game, which encourage finding the smartest possible way to express a problem in a language to achieve best performance, an equally interesting but different problem.
    >To allow us to compare the degree of optimization done by the implementations as well as the absolute performance achieved, we set the following basic rules:
    >The benchmark is 'identical' for all languages. This is achieved by relying only on a widely available and commonly used subset of language features and data types.
    >The benchmarks should use language 'idiomatically'. This means, they should be realized as much as possible with idiomatic code in each language, while relying only on the core set of abstractions.
    https://github.com/smarr/are-we-fast-yet

    >C++98 gcc -O2 vs. Node.js 12.16
    >all times in μs
    https://github.com/rochus-keller/Are-we-fast-yet/blob/main/FreePascal/Are-we-fast-yet_FreePascal_results.pdf

    >Unity ruckelt wegen Müllabfuhr-Spikes, obwohl Multi-Milliarden-Dollar-Firma, deren Brötchengeber das ist
    >C# suspendiert Fäden, obwohl ebenfalls Multi-Billionen-Dollar-Firma, die in den 2000ern voll drauf abgefahren ist
    >Java braucht kostenpflichtige VM
    Tut mir Leid, das hört sich alles nicht nach einer Programmiersprache/Implementierung von der Stange an, die die Feuerfuchs-Entwickler einfach verwenden könnten.

    Darüber hinaus hat Müllabfuhr das bereits angesprochene Grundproblem, dass sie eben ausgeführt werden muss. D.h. auch im behindertsten Moment loslaufen kann, insbesondere dann, wenn alle Fäden eigentlich schon was zu tun haben. Man hat damit etwas, das der Programmierer nicht steuern kann. Das ist schlecht, egal ob Teil der Programmiersprache/Implementierung, der Standardbibliothek der Programmiersprache oder von externen Bilbiotheken. Felix würde sogar sagen, man hat in den letzten Jahren (mit immer mehr Verbreitung von "Rahmenwerken" in vielen Bereichen der Computerey) immer mehr gesehen, dass Nichtsteuerbarkeit eine grundschlechte Idee ist. Wie soll der Programmierer da dann noch Performanz sicherstellen? Man schaue sich Bild relatiert an, und überlegt sich, wenn auf einem Faden plötzlich die Müllabfuhr reinplatzt.

    Das ist Felixens Meinung nach ein Grundproblem, dem sich auch die Müllabfuhrleute merkwürdigerweise viel zu wenig angenommen haben.

    >CL hat Laufzeitkompilierung von Kot als Standardfeature, es genügt also, den Kot in optimiertes CL zu übersetzen.
    Wo ruft der Kot die Müllabfuhr von SBCL auf? Wie das gelöst wäre, wäre doch das interessante und der Knackpunkt, weil man das selbst steuern möchte und die Müllabfuhr nicht anspringen soll, wenn z.B. der Benutzer gerade die Seite scrollt.

    Bonus: Felix sieht gerade, dass der Feuerfuchs mit privacy.resistFingerprinting = true es nicht hinkriegt, auf DuRöhre ein 60-FPS-Video in doppelter Geschwindigkeit (=120 Hz) abzuspielen, ohne dass Frames gedroppt werden. Und ja, es liegt nicht nur ein Artefakt bei Zeitmessungen, sondern Felix konnte gedroppte Frames auf dem Monitor gerade nachweisen. Mit privacy.resistFingerprinting = false ist es weg. Jetzt hat Felix also wieder ein Problem, das er nicht ignorieren kann, und mal wieder liegt es an irgendwelchem hochperformanten Hochperformanzkot...
  • [l] Felix Sun, 19 Jan 2025 23:39:37 GMT Nr. 145674
    Felix war allgemein nie ein Freund von der Müllabfuhr. Aber man kann über das Für und Wider ja diskutieren. Es mag Anwendungsfälle geben, in denen es geeignet ist, aber einer gehört sicherlich nicht dazu und das sind Videospiele. Also keine Ahnung, was Unity sich dabei gedacht hat. Naja, Felix kann es sich schon denken: Unsere Anwender sind Vollidioten, die sonst den Speicher vollkoten würden.
  • [l] Felix Tue, 21 Jan 2025 21:37:29 GMT Nr. 145864
    >>145661
    > Unsere Anwender sind Vollidioten, die sonst den Speicher vollkoten würden.
    Wenn ich mir anschaue wer so in Programmierersöckchen rumspringt liegt der Verdacht nicht so fern.


  • [l] Felix Wed, 22 Jan 2025 01:23:04 GMT Nr. 145874
    >>145661
    Komplett pausenloser GC ist nun mal für 99%+ aller Programme eine Quatschanforderung deinerseits, da Pausen insbesondere im niedrigen einstelligen Millisekundenbereich unbedenklich sind. Das gilt selbst für die meisten Videospiele, geschweige denn Brauser. Da muss man sich nicht wundern, dass das eher Nischenkram ist, für den entsprechend Geld auf den Tisch gelegt wird.

    Ein GC würfelt auch nicht aus, wann er denn mal spaßeshalber alles anhält, sondern tut dies in den meisten Implementationen nur, wenn der Speicher bei einer Allokation zur Neige geht (steht auch in deinem verelften Artikel). Mit anderen Worten: Wo wenig alloziert wird, wird auch nur selten und kurz pausiert. In Anwendungen mit hohen Latenzanforderungen sorgt man auch ohne GC schon dafür, weil Latenz und Durchsatz von malloc/free meist erbärmlich sind. Diese Idee, dass man in Sprachen mit GC gar nicht um Allokationen herumkommt, ist vor allem ein Javaismus.

    >Was soll das heißen?
    Dass bei V8 wie bei jedem anderen Programm auch priorisiert wird; niemand im V8-Team optimiert etwas, dass nicht so oft ausgeführt wird, dass es sich letzten Endes doch um mehr als Mikrosekunden handelt. Dass Zeiten in Mikrobankmarken winzig sind, liegt in der Natur der Mikrobankmarken.

    >>Unity ruckelt wegen Müllabfuhr-Spikes, obwohl Multi-Milliarden-Dollar-Firma, deren Brötchengeber das ist
    Unity ist ein Saftladen, der zehn Jahre gebraucht hat, um Grundlagen wie verschachtelte Prefabs zu implementieren, und ihren schlecht gewählten GC Ewigkeiten nichtinkrementell betrieben haben, was für Videospiele tatsächlich kernbehindert ist. Die sind nun wirklich kein Maßstab für Kompetenz.

    >Wo ruft der Kot die Müllabfuhr von SBCL auf?
    Genau so wie man sie in normalem Kot aufrufen würde.


[Zurück]
[c] [meta] [fefe]