Fast_io ist eine C ++ 20 -Eingangs-/Ausgangsbibliothek, die eine außergewöhnliche Geschwindigkeit bietet und die häufig verwendeten Bibliotheken <iostream> und <cstdio> ersetzen soll. Es handelt sich nur um eine Bibliothek mit Header, die unter der MIT-Lizenz lizenziert wird, wodurch es einfach ist, in jedes Projekt aufzunehmen. Es erfordert jedoch einen C ++ 20 -Compiler, der Konzepte unterstützt.
Das ursprüngliche Repository für FAST_IO wurde im Laufe der Zeit aufgrund von Git -Bloat archiviert, aber dort finden Sie immer noch ältere Commits. Alte Commits waren hier.
stdout # include < fast_io.h >
int main () {
print ( " Hello, fast_io world! n " );
}# include < fast_io.h >
int main () {
fast_io::native_file_loader file_data ( " text.txt " );
// file_data satisfies std::ranges::contiguous_range
} Weitere aktuelle Beispiele finden Sie in den examples/ Ordner.
Veraltete Beispiele sind hier, aber sie funktionieren möglicherweise nicht mehr.
Dieses I18N -Repo speichert die i18N -Quelldateien.
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
Der Begriff fast in fast_io bedeutet nicht unbedingt, dass es sich um die schnellste Eingabe-/Ausgabebibliothek handelt (wie sie stattdessen als schnellestes als fastest_io bezeichnet worden wäre). Stattdessen bezieht sich der Begriff auf die Tatsache, dass fast_io in allen Fällen besonders schneller als <iostream> und <cstdio> Bibliotheken ist.
In Support.md finden Sie eine Liste unterstützter Dinge und plattformspezifische Nutzungsnotizen.
Sie können Fragen zum Fast_io Discord Server oder auf der QQ -Gruppe: 801441303 stellen.
Siehe entweder https://ewindy.gitee.io/fast_io_rst/index.html oder https://gitee.com/qabeowjbtkwb/fast_io/wikis.
So nah wie möglich am Systemanruf.
UNICODE-Unterstützung (UTF-8, UTF-16, UTF-32) + Codecvt für GB18030 und UTF-EBCDIC (kein LIBC befasst sich korrekt damit)
Raii für C FILE* , POSIX fd und Win32/NT HANDLE
Interop mit <cstdio> und <iostream>
Keine leicht missbrauchten Sachen wie std::endl
Statische E/O -Manipulatoren anstelle von Formatketten.
Optionales Gebietsschema.
Staatelose I/O -Manipulation.
Konsistente Fehlerbehandlung; Bei verfügbarer Ausnahmen als einziger Fehlerberichterstattungsmechanismus (No std::error_code , std::system_error oder nutzlose Grenzen)
Freistehender Modus.
Spezifische Desinfektionsmittelcode zum Schutz der Speichersicherheitsprobleme.
Dynamische Instrumentierungsunterstützung
Unterstützt POSIX ICONV. Sie können Fast_io für Ihre Codierungskonvertierung verwenden.
Binäre Serialisierung für trivial kopierbare Typen und Standardcontainer
Spielt gut mit C ++ - Containern (z. B. std::vector<fast_io::obuf_file> gilt)
Basic/Lua/Python/etc Format (Druck, Scan). Keine Unterstützung für C und C ++, da es sich um Sicherheitsrisiken handelt.
Geben Sie APIs zur Verfügung, um die interne Implementierung von FILE* und C ++ - Streams aufzudecken.
Native Griffschnittstelle
Extrem einfach zu unterstützen benutzerdefinierte Geräte
C- und C ++ - Style Compile Time Open -Modus -Parsen.
Keine traits_type und EOF
Dynamischer Typunterstützung
Multi -Prozess
Speicherzuordnung
Debugging IO (optional mit GUI)
Schwimmpunktalgorithmus zur Hin-
Hash-Algorithmen Unterstützung: Intrinsic SHA-1, Intrinsic HMAC-SHA1, Intrinsic SHA-256, Intrinsic HMAC-SHA256, SHA-512, HMAC-SHA512 sowie Nicht-Krypto-Hash-Algorithmen wie Jenkins Hash.
ZLIB -Komprimierung/Dekompression
Dateisystem
OpenSSL BIO, QT QFILE, MFC CFILE -Unterstützung
Ziel: Drucken Sie zehn Millionen Ganzzahlen von 0 bis 10 m zur Einreichung aus. Öffnen Sie dann diese Datei wieder, um zurück zu scannen.
Alle Benchmarks finden Sie in Benchmarks/0000.10m_size_t/Unit.
Hinweis: Ich habe die Bufsiz 1048576 von libstdc ++ modifiziert, da Bufsiz für Mingw-W64 zu klein ist (512 Bytes), oder es ist schrecklich.
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt+ libstdc ++ |
|---|---|---|---|
| Verfahren | Ausgangszeit | Eingabemaßzeit | Kommentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 2.412987s | 5.607791s | |
| fstream | 0,462012s | 1.192s | |
| fstream mit rdbuf.Sputc Trick | 0,33895s | 1.170173s | |
| fast_io :: i/obuf_file | 0,04903s | 0,080996s | |
| fast_io :: i/obuf_file_mutex | 0,146064s | 0,113155s | Faden sicher |
| c_locale_i/obuf_file ("c") | 0,065988s | 0,086012s | mit Gebietsschema "C" durchdrungen. |
| c_locale_i/obuf_file lokal | 0,153995s | mit Gebietsschema durchdrungen, "Gebietsschema" "" | |
| fmt :: format_int+obuf_file | 0,122999s | ||
| fmt :: format_int+of Stream | 0,209055s | ||
| fmt :: Format+Ofstream | 0,548S | FMT macht die Dinge langsamer | |
| fmt :: drucken | 0,663996s | FMT macht die Dinge langsamer | |
| std :: to_chars+obuf_file | 0,12s | ||
| std :: to_chars+of Stream | 0,192s | ||
| fast_io :: c_file_unlocked | 0,098999s | 0,126003s | Ich habe die Datei* Implementierung von MSVCRT gehackt |
| fast_io :: c_file | 0,298988s | 0,318001s | Faden sicher. Ich habe die Datei* Implementierung von MSVCRT gehackt |
| fast_io :: fileBuf_file | 0,048999s | 0,081s | Ich habe die Streambuf/FileBuf -Implementierung von libstdc ++ gehackt |
| fast_io :: iobuf_utf8_file_char16 | 0,124s | 0,112001s | UTF-16 => UTF-8 mit SSE |
| fast_io :: iobuf_utf8_file_char32 | 0,110999s | 0.111011s | UTF-32 => UTF-8 mit SSE |
| std :: wofstream | 2.64s | 3.843735s | wofstream mit std :: loceme codecvt. Extrem langsame TBH. |
| FAST_IO :: WFILEBUF_IO_OBSERVER | 2.415692s | 2.497704s | wofstream mit std :: loceme codecvt. Dies beweist, dass Fstream niemals repariert werden kann. |
| Rostsprache | 0,483s | Rost ist langsam. Auch Rost befasst sich nicht mit dem Gebietsschema. Überlegen Sie, wie schlimm es ist. | |
| Rost Itoa Library 0.4.6 | > 0,165s | Ich ignorierte den n Teil dafür, um keine Vorurteile zu gewährleisten. |
Die Rostsprache ist 10x langsamer als Fast_io. + Binärer Bloat- und Itoa -Bibliothek ist für mich immer noch extrem langsam und verwendbar. Es ist mindestens 3x langsamer als Fast_io.
Führen Sie den gleichen Test auf MSVC 19.26.28805 durch.
| Plattform | Fenster | MSVC 19.26.28805 | Installieren Sie FMTLIB -Abfallzeit meines Lebens |
|---|---|---|---|
| Verfahren | Ausgangszeit | Eingabemaßzeit | Kommentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 1,5353597s | 1.4157233s | |
| fstream | 3.6350262s | 3.8420339s | |
| fstream mit rdbuf.Sputc Trick | 3.3735902s | 3.8145566s | |
| fast_io :: i/obuf_file | 0,0631433s | 0,1030554s | |
| fast_io :: i/obuf_file_mutex | 0,2190659s | 0,2485886s | Faden sicher |
| std :: to_chars+obuf_file | 0,1641641s | ||
| std :: to_chars+of Stream | 0,5461922s | ||
| fast_io :: c_file_unlocked | 0,1102575s | 0,2399757s | Ich habe die Datei* Implementierung von Universal CRT gehackt |
| fast_io :: c_file | 0,2034755s | 0,2621148s | Faden sicher. Ich habe die Datei* Implementierung von UCRT gehackt |
| fast_io :: fileBuf_file | 0,126661s | 0,2378803s | Ich habe die Streambuf/FileBuf -Implementierung von MSVC STL gehackt |
Führen Sie den gleichen Test auf GCC 11 durch. GLIBC+ libstdc ++
| Plattform | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| Verfahren | Ausgangszeit | Eingabemaßzeit | Kommentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 0,532792935s | 0,591907111s | |
| fstream mit rdbuf.Sputc Trick | 0,318896068S | 0,429406415s | |
| fast_io :: i/obuf_file | 0.050300857s | 0,065372395s | |
| fast_io :: i/obuf_file_mutex | 0,05290654S | 0,083040518s | Faden sicher |
| c_locale_i/obuf_file ("c") | 0,051939052s | 0,065820056s | mit Gebietsschema "C" durchdrungen. |
| c_locale_i/obuf_file lokal | 0,162406082s | mit Gebietsschema durchdrungen, "Gebietsschema" "" | |
| std :: to_chars+obuf_file | 0,115453587s | ||
| fmt :: format_int+obuf_file | 0,1183587s | ||
| fmt :: format_int+of Stream | 0,195914384s | ||
| fmt :: Format+Ofstream | 0,633590975s | FMT macht die Dinge langsamer | |
| fmt :: drucken | 0,495270371s | FMT macht die Dinge langsamer | |
| Boost :: iOstreams | 0,400906063s | 0,444717051s | Durch die Verwendung von Boost iOstreams wird Ihr Code nicht schneller |
| fast_io :: c_file_unlocked | 0,060076723s | 0,073299716s | Ich habe die Datei* Implementierung von Glibc gehackt |
| fast_io :: c_file | 0,092490191s | 0,104545535s | Faden sicher. Ich habe die Datei* Implementierung von Glibc gehackt |
| fast_io :: fileBuf_file | 0,052251608s | 0,06655806s | Ich habe die Streambuf/FileBuf -Implementierung von libstdc ++ gehackt |
Sie können sehen, dass Fast_io auch die Leistung vorhandener Einrichtungen für 10x steigern kann! Ja, es kann sogar die Leistung von Datei* und die Leistung von Fstream für 10x verbessert, je nach Plattformen, da ich Konzepte verwende, um sie alle abstrahieren. FMTLIB verlangsamt die E/A -Leistung tatsächlich.
Wir führen diesen Test nur für MSVC durch, da nur MSVC ihn implementiert. Ja. Fast_io besiegt MSVCs Charconv für über 20%, um denselben Algorithmus auszuführen.
Alle Benchmarks befinden sich in Benchmarks/0001.10m_double/charconv.
Führen Sie den gleichen Test auf MSVC 19.26.28805 durch.
| Plattform | Fenster | MSVC 19.26.28805 | |
|---|---|---|---|
| Verfahren | Ausgangszeit | Kommentar |
|---|---|---|
| i/obuf_file | 0,4653818s | |
| charconv + obuf_file | 0,6011s |
Alle Benchmarks finden Sie in Benchmarks/0014.File_io/file_io.
Ausgabe 100000000x "Hello World N"
Hinweis: Ich habe Libstdc ++ von std :: fileBufs bufsiz an 1048576 aufgrund von bufsiz zu klein (512 Bytes) für Mingw-W64 oder es für schrecklich ausgeführt.
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt+ libstdc ++ |
|---|---|---|---|
| Verfahren | Ausgangszeit | Kommentar |
|---|---|---|
| frite | 2.524001s | |
| fstream | 1.013001s | |
| FAST_IO :: OBUF_FILE | 0,437998s | |
| FAST_IO :: OBUF_FILE_MUTEX | 1,371s | Faden sicher |
| fast_io :: c_file_unlocked | 1.164997s | Ich habe die Datei* Implementierung von MSVCRT gehackt |
| fast_io :: c_file | 3.337945s | Faden sicher. Ich habe die Datei* Implementierung von MSVCRT gehackt. Brauchen weitere Optimierung |
| fast_io :: fileBuf_file | 0,467001s | Ich habe Libstdc ++ Std :: FileBuf -Implementierung gehackt |
| Plattform | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| Verfahren | Ausgangszeit | Kommentar |
|---|---|---|
| frite | 1.457288317s | |
| fstream | 1.249783346s | |
| FAST_IO :: OBUF_FILE | 0,494827134s | |
| FAST_IO :: OBUF_FILE_MUTEX | 0,497138826s | Faden sicher |
| fast_io :: c_file_unlocked | 0,687976666s | Ich habe die Datei* Implementierung von Glibc gehackt |
| fast_io :: c_file | 0,910792697s | Faden sicher. Ich habe die Datei* Implementierung von Glibc gehackt |
| fast_io :: fileBuf_file | 0,526955039s | Ich habe Libstdc ++ Std :: FileBuf -Implementierung gehackt |
| Plattform | Fenster | MSVC 19.26.28805 | UCRT + MSVC STL |
|---|---|---|---|
| Verfahren | Ausgangszeit | Kommentar |
|---|---|---|
| frite | 3.3139122s | |
| fstream | 1.7184119s | |
| FAST_IO :: OBUF_FILE | 0,7996034S | |
| FAST_IO :: OBUF_FILE_MUTEX | 2.2949221s | Faden sicher. Es sieht so aus, als ob STD :: Mutex für MSVC STL schrecklich langsam ist. |
| fast_io :: c_file_unlocked | 1.2103924s | Ich habe die Datei* Implementierung von UCRT gehackt |
| fast_io :: c_file | 2.3604295s | Faden sicher. Ich habe die Datei* Implementierung von UCRT gehackt |
| fast_io :: fileBuf_file | 1.2805368s | Ich habe die STD :: FileBuf -Implementierung von MSVC STL gehackt |
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt + libstdc ++ + statische Kompilierung |
|---|---|---|---|
| Verfahren | Binäre Größe | Kommentar |
|---|---|---|
| fstream | 925 kb | Verwenden Sie FStream ist nicht gut für Ihre Gesundheit, da STD :: Locale Ihre Binärdatum aufblickt. |
| FAST_IO :: OBUF_FILE | 155 KB | |
| fast_io :: c_file_unlocked | 157 kb | Ich habe die Datei* Implementierung von MSVCRT gehackt |
| fast_io :: c_file | 157 kb | Faden sicher. Ich habe die Datei* Implementierung von MSVCRT gehackt |
| fast_io :: fileBuf_file | 933KB | Ich habe Libstdc ++ Std :: FileBuf -Implementierung gehackt. C ++ Stream saugt |
100000000 erzeugen? Emojis unter Verwendung des Programms in Benchmarks/0020.utf/fill_nc.cc
Benchmarks finden Sie in Beispielen/0043.ICONV Universal Iconv. (UTF-8 bis GB18030 als Beispiel) Iconv-Test:
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt+ libstdc ++ |
|---|---|---|---|
| Verfahren | Verstrichene Zeit | Kommentar |
|---|---|---|
| ICONV -Befehl | 1,529s | |
| Universal.cc | 1,293s | Verwenden Sie POSIX Libiconv |
UTF8-> UTF16LE
Benchmarks sind in Beispielen/0022.utf
Iconv -Test:
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt+ libstdc ++ |
|---|---|---|---|
| Verfahren | Verstrichene Zeit | Kommentar |
|---|---|---|
| ICONV -Befehl | 0,967s | GNU ICONV. Keine Bom |
| UTF8_FILE_TO_UTF16_FILE.CC | 0,498s | Ich verwende die SSE-Algorithmen, die vom UTF-Utils-Projekt bereitgestellt werden. |
UTF8-> UTF32LE
Benchmarks sind in Beispielen/0022.utf
Iconv -Test:
| Plattform | Fenster | Mingw-w64 GCC 11.0.0 | Msvcrt+ libstdc ++ |
|---|---|---|---|
| Verfahren | Verstrichene Zeit | Kommentar |
|---|---|---|
| ICONV -Befehl | 0,844s | GNU ICONV. Keine Bom |
| UTF8_FILE_TO_UTF32_FILE.CC | 0,442s | Ich verwende die SSE-Algorithmen, die vom UTF-Utils-Projekt bereitgestellt werden. |
Die Schaffung und Entwicklung dieses Projekts wurde dank der wertvollen Beiträge verschiedener Open-Source-Projekte ermöglicht. Während der Code nicht direkt aus diesen Projekten kopiert wurde, habe ich sie als Referenzen verwendet und sie neu implementiert, um den spezifischen Zwecken dieser Bibliothek zu entsprechen. In einigen Fällen ergaben sich Integrationsprobleme, die Änderungen am ursprünglichen Code erforderten. Ich bin diesen Projekten und ihren Entwicklern dankbar für ihr Engagement, ihren Code offen und für die breitere Community zugänglich zu machen.
| Projekt | URL |
|---|---|
| Grisu-passend | https://github.com/jk-jeon/grisu-exact |
| Ryu | https://github.com/ulfjack/ryu |
| Sha-Intrinsik | https://github.com/noloader/sha-intrinsics |
| Sha1 | https://github.com/vog/sha1 |
| UTF-Utils | https://github.com/bobsteagall/utf_utils |
| Jenkins-Hash-Java | https://github.com/vkandy/jenkins-hash-java |
| MD5 | https://github.com/jieweiwei/md5 |
| Reactos | https://github.com/reactos/reactos |
| Dirent_H | https://github.com/win32ports/dirent_h |
| GNU C -Bibliothek | https://www.gnu.org/software/libc/ |
| Gnu Newlib | https://sourceware.org/newlib/ |
| Dragonbox | https://github.com/jk-jeon/dragonbox |
| Jaiiii | https://github.com/jaiii/itoa |
| Crypto ++ | https://github.com/weidai11/Cryptopp |
| Myitoa | https://gitee.com/xjkp2283572185/mystd |