boxes
360 abgerundete, umrandete, gefüllte Boxen
alle 2 Seiten · p95 20,9 ms
benchmark · reines TypeScript · selbst ausführen
Sechs Dokumente, vier Engines, jeder Vergleich mit demselben Text auf denselben Seiten. jasy ist eine PDF-Engine in reinem TypeScript - kein Headless-Browser, kein WASM, keine JVM - und damit rendern @jasy/vue, @jasy/react, @jasy/angular und @jasy/nuxt.
Flexbox-Layout, in reinem TypeScript.
Setzt das Dokument selbst - Zeilenumbrüche, Seitenumbrüche, Kerning, SVG. Kein Headless-Browser, kein WASM, keine JVM.
Flexbox-Layout, als React-Komponenten.
Dieselbe Aufgabe über Yoga und einen React-Baum. Der engste Vergleich auf dieser Seite.
Deklaratives Layout, ein Dokumentobjekt.
Setzt ebenfalls selbst, mit eigenem Spalten- und Tabellenmodell. Kernt und nimmt SVG-Markup direkt.
Eine Zeichen-API. Kein Layout.
Sie berechnen jede Koordinate und jeden Seitenumbruch. Darum ist es hier schnell, und darum sind zwei Fälle leer.
Beide Zahlen sind geometrische Mittel, der korrekte Durchschnitt von Verhältnissen. jsPDF steckt nicht darin - es zeichnet, wo diese setzen, und ein Durchschnitt über beides hieße nichts. Sein Vergleich hat unten einen eigenen Abschnitt, Niederlagen eingeschlossen.
Die Balken sind innerhalb eines Falls maßstabsgetreu, gemessen an seiner langsamsten Engine. Jedes Paar wurde auf dieselben Wörter auf denselben Seiten geprüft, bevor ein Verhältnis erschien.
360 abgerundete, umrandete, gefüllte Boxen
alle 2 Seiten · p95 20,9 ms
40 Diagramme mit je 24 Balken, mit dem imperativen Pen gezeichnet
alle 4 Seiten · p95 4,7 ms
ein Bericht: wiederholter Header und Footer, 24 Absätze, 90 Tabellenzeilen
alle 4 Seiten · p95 17,5 ms
120 Vektorformen - Pfade, Konturen, Linienverbindungen
1 Seite · p95 8,4 ms
180 fließende Absätze - Zeilen- und Seitenumbruch
alle 13 Seiten · p95 18,7 ms
120 Absätze in einer eingebetteten TrueType-Schrift - echtes Kerning und Ligaturen
alle 7 Seiten · p95 20,0 ms
wo jasy hinten liegt
Es zeichnet, wo die anderen setzen, und Zeichnen ist billiger. Auf keiner Seite ist das ein Mangel - das Layout machen eben Sie. Im Bericht-Fall sind das 73 Zeilen jsPDF gegen 41 Zeilen jasy: jede y-Koordinate, jeder Page Break und der Header, neu gezeichnet nach jeder neuen Seite. Beides steht auf dieser Seite; lesen Sie es, statt der Zählung zu glauben.
Das ist der ganze Tausch. Über die 4 Dokumente, die beide erzeugen - 23 Seiten -, zahlen Sie zusammen rund 10 Millisekunden und schreiben diese Schleife nicht mehr. 2 der 6 Dokumente kann es gar nicht erzeugen - der SVG-Fall braucht eine zweite Bibliothek, und es kernt nie, also landen dieselben Wörter nicht an denselben Stellen.
was das ehrlich hält
Deshalb steht hier jede Regel, die dieses Messwerkzeug durchsetzt - auch die zwei, die uns die Zahlen gekostet haben, die wir lieber zeigen würden. Sie bleiben drin.
Gleiche Wörter, gleiche Anzahl, gleiche Seiten - geprüft, bevor ein Verhältnis erscheint, sonst verweigert der Runner die Ausgabe. Das hat sich zweimal bezahlt gemacht, beide Male bei unseren eigenen Fehlern: ein Fall gab react-pdf eine Zelle, die für ihre Zeile zu kurz war, sodass es gar keine Beschriftungen zeichnete, während die Seitenzahl noch stimmte; und ein Kopfabstand, den wir nur auf einer Seite gesetzt hatten, schob einen ganzen Textkörper 8 pt tiefer.
Ein Benchmark, der einen String wiederholt, misst Caching, nicht Layout. Unserer tat das, und die Wiederholung half react-pdf weit mehr als uns - auf demselben Rechner am selben Tag lag der Fließtext-Fall mit einem wiederholten Absatz 45 % zu seinen Gunsten und mit 180 verschiedenen bei 6 %. Echte Dokumente haben keine identischen Absätze, diese also auch nicht.
Dasselbe Wort bedeutet in jeder etwas anderes: eine Zeilenhöhe multipliziert in jasy die Schriftgröße, in pdfmake die natürliche Höhe der Schrift, und in react-pdf wird sie in verschachtelten Text gar nicht vererbt. Nichts davon ist ein Fehler - es muss nur umgerechnet werden, sonst brechen die Dokumente an verschiedenen Stellen um. Jede Umrechnung steht im Fall, mit dem Grund daneben.
jasy hält an einem Seitenumbruch zwei Zeilen eines Absatzes zusammen; jsPDF hat keine solche Regel. Also ist sie im Bericht-Fall abgeschaltet, bei uns und bei react-pdf. Erst das Handicap macht es zum selben Dokument.
Das Messwerkzeug, die sechs Dokumente und das rohe JSON hinter dieser Seite liegen im Repository. Es pinnt die Versionen, gegen die es vergleicht, und nennt den Rechner, auf dem es lief.
git clone https://github.com/jasy-pdf/jasy
cd jasy/bench
pnpm install
pnpm benchIhr Dokument ist nicht unter den sechs? Das ist der faire Einwand gegen jeden Benchmark, und die Antwort ist ein Pull Request - ein Fall ist eine Datei mit einer Funktion pro Engine.
Ein Rechner, ein Tag, sechs Dokumente. Ihre Zahlen werden abweichen - genau deshalb veröffentlichen wir das Messwerkzeug und nicht nur das Ergebnis.