Roc kommt bis auf 2,6 Prozent an C heran
How close can pure functional programming get to C?
Eine in Roc geschriebene DEFLATE-Bibliothek fordert libdeflate heraus, die in C verfasste, sorgfältig mit SIMD optimierte Referenzimplementierung. Über 144 Benchmarks auf dem Silesia-Korpus ist roc-deflate im Median nur 8,9 Prozent langsamer auf einem Ryzen 3900X und 2,6 Prozent auf einem M1 MacBook Pro – bei identischer Ausgabe. Bemerkenswert, weil Roc noch vor Version 0.1.0 steht und sein Paket-Ökosystem kaum optimiert ist.
roc-deflate lief in diesen 144 Benchmarks im Durchschnitt langsamer als libdeflate, im Medianfall 8,9 Prozent langsamer auf dem Ryzen 3900X und 2,6 Prozent auf dem M1 MacBook Pro.
- jandrewrogers
Ein Großteil des Unterschieds bei der Optimierbarkeit liegt darin, dass C/C++ eine ziemlich extreme Copy Elision ermöglicht. Das ist wichtig, weil die Speicherbandbreite oft einen großen Leistungsengpass darstellt.
C/C++-Code kann mühelos auf einen entfernten Teil des Zustands zugreifen und ihn direkt verändern. Den Compiler stört das selten, egal wie hässlich die Zugriffsmethode oder das Muster ist. Es liegt am Programmierer, sicherzustellen, dass die Invarianten gelten, und der Compiler kann nicht immer durchblicken. Diese eliminierten Kopien summieren sich jedoch, was meist mit Einbußen bei Wartbarkeit und Sicherheit einhergeht.
Das hängt damit zusammen, warum funktionale Sprachen in der Praxis für Supercomputing oft mittelmäßig abschneiden, obwohl sie theoretisch schöne Eigenschaften für massive Parallelität haben.
- VorpalWay
> lean-zip schlägt jede einzelne Kompressionsstufe von miniz_oxide
Miniz_oxide ist eine bewusst einfache Implementierung. Fairer wäre ein Vergleich mit dem neueren zlib-rs[1], das sogar zlib-ng (die schnellste C-Implementierung) schlägt[2].
[1]: https://lib.rs/crates/zlib-rs
[2]: https://trifectatech.org/blog/zlib-rs-is-faster-than-c/
- gobdovan
Hast du darüber nachgedacht, diese Optimierungen über eine Bibliothek zugänglich zu machen, sodass Programmierer Optimierungsdurchläufe anfordern können und der Compiler die Vorbedingungen prüft?
Ich frage, weil ich einen Artikel darüber vorbereite, wie schnell JS werden kann, und dasselbe festgestellt habe: Man kann mit praktisch jedem Code auf 10 % von optimiertem C-Code kommen, wenn man V8 nur genug quält (außer bei SIMD, wo es einen Bug in V8 zu geben scheint, sodass es nicht zu SIMD optimiert, selbst wenn es überdeutlich ist). Ich habe herausgefunden, dass ich das in eine Bibliothek auslagern und es so optimierter gestalten könnte, aber ich bin nicht sicher, wie gut sich manuelle Transformationen verallgemeinern lassen.
Außerdem: Hast du bei der Arbeit an roc-deflate wiederkehrende Transformationen gefunden, die in dieses Modell passen würden, oder waren die meisten Verbesserungen spezifisch für Kompression?
- ReDress
C ist tatsächlich eine funktionale Sprache insofern, als die meisten C-Projekte Dinge sind, die im echten Leben beobachtet und anschließend in Computer hochgeladen wurden.
Ich möchte auch anmerken, dass Performance in vielen Fällen das ALLERWICHTIGSTE Anliegen ist.
Wenn du einen Server hast, der in einer Minute 10 Millionen Anfragen an eine bestimmte Methode stellt, dann kannst du dir keinerlei Performance-Kompromisse leisten. Keine, überhaupt keine.
Rust wird C/C++ im Bereich High Performance Computing niemals ersetzen.
- johnny22
Zu sagen, es "schlägt eine Crate, die X-mal heruntergeladen wurde", sagt nichts anderes aus, als dass sie beliebt ist. Es wäre schön, dort etwas mehr Details zu sehen.