Fast_io est une bibliothèque d'entrée / sortie C ++ 20 qui fournit <cstdio> vitesse exceptionnelle et est conçue pour remplacer les bibliothèques <iostream> couramment utilisées. Il s'agit d'une bibliothèque d'en-tête uniquement et est autorisée sous la licence MIT, ce qui facilite l'inclure dans n'importe quel projet. Cependant, il nécessite un compilateur C ++ 20 qui prend en charge les concepts.
Le référentiel d'origine pour FAST_IO a été archivé en raison de Git Bloat au fil du temps, mais les commits plus anciens peuvent encore y être trouvés. Les anciens commits étaient là.
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
} Pour d'autres exemples à jour, veuillez consulter les examples/ dossiers.
Les exemples obsolètes sont ici, mais ils pourraient ne plus fonctionner.
Ce repo i18n stocke les fichiers source i18n.
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
Le terme fast dans fast_io n'implique pas nécessairement qu'il s'agit de la bibliothèque d'entrée / sortie la plus rapide disponible (car elle aurait été nommée fastest_io à la place). Au lieu de cela, le terme fait référence au fait que fast_io est notamment plus rapide que les bibliothèques <iostream> et <cstdio> dans tous les cas.
Voir support.md pour une liste de choses prises en charge et des notes d'utilisation spécifiques à la plate-forme.
Vous pouvez poser des questions sur le serveur Discord Fast_io ou le groupe QQ: 801441303 .
Voir https://ewindy.gitee.io/fast_io_rst/index.html ou https://gitee.com/qabeowjbtkwb/fast_io/wikis.
Aussi proche de l'appel système que possible.
Prise en charge Unicode (UTF-8, UTF-16, UTF-32) + CodeCVT pour GB18030 et UTF-EBCDIC (aucune LIBC traite correctement)
RAII pour FILE* , POSIX fd et WIN32 / NT HANDLE
Interopérez avec <cstdio> et <iostream>
Pas de trucs facilement utilisés comme std::endl
Manipulateurs d'E / S statiques au lieu de chaînes de format.
Locaux facultatifs.
Manipulation d'E / S apatride.
Gestion des erreurs cohérentes; Lorsqu'il est disponible, les exceptions comme seul mécanisme de rapport d'erreur (pas de vérification des limites std::error_code , std::system_error ou inutiles)
Mode autoportant.
Adressez le code spécial du désinfectant pour protéger les problèmes de sécurité de la mémoire.
Support d'instrumentation dynamique
Prend en charge POSIX ICONV. Vous pouvez utiliser Fast_io pour votre conversion de codage.
Sérialisation binaire pour les types à copie trivialement et les conteneurs standard
Joue bien avec les conteneurs C ++ (par exemple std::vector<fast_io::obuf_file> est valide)
Format de base / lua / python / etc (imprimer, scan). Aucun support pour C et C ++ car ce sont des dangers de sécurité.
Fournissez des API pour exposer l'implémentation interne des flux FILE* et C ++.
Interface de poignée native
Extrêmement facile à prendre en charge les appareils personnalisés
CA et C ++ Compilation de compilation Mode ouvert Analyse du mode.
Pas de traits_type et EOF
Support de type dynamique
Multi-processus
Mappage de mémoire
Débogage d'IO (éventuellement avec GUI)
Algorithme de point flottant aller-retour
Support des algorithmes de hachage: SHA-1 intrinsèque, HMAC-Sha1 intrinsèque, SHA-256 intrinsèque, HMAC-SHA256 intrinsèque, SHA-512, HMAC-SHA512 ainsi que les algorithmes de hachage non crypto, comme le hasch de Jenkins.
Compression / décompression ZLIB
Système de fichiers
OpenSSL BIO, QT QFILE, MFC CFILE Prise en charge
Objectif: Imprimez dix millions d'entiers de 0 à 10m pour déposer. Reouvrez ensuite ce fichier pour analyser.
Tous les repères sont en référence / 0000.10m_size_t / unité.
AVIS: J'ai modifié le Bufsiz 1048576 de LibStDC ++ en raison de Bufsiz est trop petit (512 octets) pour Mingw-W64, ou il fonctionne horriblement.
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | Msvcrt + libstdc ++ |
|---|---|---|---|
| Méthode | Temps de sortie | Heure d'entrée | Commentaire |
|---|---|---|---|
| stdio.h (fprintf / fscanf) | 2.412987S | 5.607791S | |
| fléau | 0.462012S | 1.192S | |
| fstream avec rdbuf.sputc Trick | 0,33895 | 1.170173 | |
| fast_io :: i / obuf_file | 0,04903 | 0,080996S | |
| fast_io :: i / obuf_file_mutex | 0.146064S | 0,113155 | Fitre en toute sécurité |
| c_locale_i / obuf_file ("c") | 0,065988S | 0,086012 | imprégné de paramètres régionaux, de paramètres régionaux "C" |
| c_locale_i / obuf_file local | 0,153995S | imprégné de paramètres régionaux, de paramètres régionaux "" | |
| fmt :: format_int + obuf_file | 0.122999S | ||
| FMT :: FORMAT_INT + OFSTREAM | 0.209055 | ||
| FMT :: Format + OfStream | 0,548 | FMT rend les choses plus lentes | |
| FMT :: IMPRIM | 0,663996S | FMT rend les choses plus lentes | |
| std :: to_chars + obuf_file | 0,12 s | ||
| std :: to_chars + ofstream | 0,192 | ||
| fast_io :: c_file_unlocked | 0,098999S | 0.126003 | J'ai piraté l'implémentation du fichier de MSVCRT * |
| fast_io :: c_file | 0,298988S | 0,318001 | Filé en toute sécurité. J'ai piraté l'implémentation du fichier de MSVCRT * |
| fast_io :: filebuf_file | 0,048999S | 0,081 | J'ai piraté l'implémentation de libstdc ++ streambuf / filebuf |
| fast_io :: iobuf_utf8_file_char16 | 0,124S | 0.112001 | UTF-16 => UTF-8 avec SSE |
| fast_io :: iobuf_utf8_file_char32 | 0.110999S | 0,111011 | UTF-32 => UTF-8 avec SSE |
| std :: wofstream | 2.64S | 3.843735 | wofstream avec std :: codecvt. TBH extrêmement lent. |
| fast_io :: wfilebuf_io_observer | 2.415692S | 2.497704S | wofstream avec std :: codecvt. Cela prouve que FSTREAM ne peut jamais être réparé. |
| Langue de rouille | 0,483 | La rouille est lente. La rouille ne traite pas également avec les paramètres régionaux. Pensez à quel point c'est mauvais. | |
| Bibliothèque Rust Itoa 0.4.6 | > 0,165 | J'ai ignoré la partie n pour qu'il n'assure aucun biais. |
Le langage de la rouille est 10x plus lent que Fast_io. + Binary Bloat et Itoa Library est toujours extrêmement lent et utilisable pour moi. Il est au moins 3x plus lent que Fast_io.
Exécutez le même test sur MSVC 19.26.28805.
| Plate-forme | Fenêtre | MSVC 19.26.28805 | Installer FMTLIB gaspille le temps de ma vie |
|---|---|---|---|
| Méthode | Temps de sortie | Heure d'entrée | Commentaire |
|---|---|---|---|
| stdio.h (fprintf / fscanf) | 1.5353597 | 1.4157233 | |
| fléau | 3.6350262 | 3.8420339 | |
| fstream avec rdbuf.sputc Trick | 3.3735902S | 3.8145566 | |
| fast_io :: i / obuf_file | 0,0631433 | 0.1030554 | |
| fast_io :: i / obuf_file_mutex | 0.2190659S | 0,2485886 | Fitre en toute sécurité |
| std :: to_chars + obuf_file | 0.1641641 | ||
| std :: to_chars + ofstream | 0,5461922 | ||
| fast_io :: c_file_unlocked | 0.1102575 | 0,2399757 | J'ai piraté l'implémentation du fichier de CRT universel * |
| fast_io :: c_file | 0.2034755 | 0,2621148 | Filé en toute sécurité. J'ai piraté l'implémentation du fichier d'UCRT * |
| fast_io :: filebuf_file | 0,126661 | 0,2378803 | J'ai piraté l'implémentation de MSVC STL StreamBuf / FileBuf |
Exécutez le même test sur GCC 11. GLIBC + LIBSTDC ++
| Plate-forme | Linux | GCC 11.0.0 | glibc + libstdc ++ |
|---|---|---|---|
| Méthode | Temps de sortie | Heure d'entrée | Commentaire |
|---|---|---|---|
| stdio.h (fprintf / fscanf) | 0,532792935S | 0,591907111S | |
| fstream avec rdbuf.sputc Trick | 0,318896068S | 0.429406415S | |
| fast_io :: i / obuf_file | 0,050300857 | 0,065372395 | |
| fast_io :: i / obuf_file_mutex | 0,05290654S | 0,083040518S | Fitre en toute sécurité |
| c_locale_i / obuf_file ("c") | 0,051939052S | 0,065820056 | imprégné de paramètres régionaux, de paramètres régionaux "C" |
| c_locale_i / obuf_file local | 0.162406082S | imprégné de paramètres régionaux, de paramètres régionaux "" | |
| std :: to_chars + obuf_file | 0,115453587 | ||
| fmt :: format_int + obuf_file | 0,1183587 | ||
| FMT :: FORMAT_INT + OFSTREAM | 0.195914384S | ||
| FMT :: Format + OfStream | 0,633590975S | FMT rend les choses plus lentes | |
| FMT :: IMPRIM | 0.495270371 | FMT rend les choses plus lentes | |
| boost :: iostreams | 0.400906063 | 0.444717051 | L'utilisation de boost iOStreams ne rend pas votre code plus rapidement |
| fast_io :: c_file_unlocked | 0,060076723 | 0,073299716S | J'ai piraté le fichier de GLIBC * Implémentation |
| fast_io :: c_file | 0,092490191S | 0,104545535 | Filé en toute sécurité. J'ai piraté le fichier de GLIBC * Implémentation |
| fast_io :: filebuf_file | 0,052251608S | 0,06655806S | J'ai piraté l'implémentation de libstdc ++ streambuf / filebuf |
Vous pouvez voir que Fast_io peut également augmenter les performances des installations existantes pour 10x! Oui, il peut même améliorer les performances du fichier * et FSTREAM pour 10x en fonction des plates-formes car j'utilise des concepts pour les abstraire tous. FMTLIB ralentit en fait les performances d'E / S.
Nous effectuons ce test pour MSVC car seul CharconV de MSVC l'indique. Oui. Fast_io bat Charconv de MSVC pour plus de 20% pour exécuter le même algorithme.
Tous les repères sont en référence / 0001.10m_double / charconv.
Exécutez le même test sur MSVC 19.26.28805.
| Plate-forme | Fenêtre | MSVC 19.26.28805 | |
|---|---|---|---|
| Méthode | Temps de sortie | Commentaire |
|---|---|---|
| i / obuf_file | 0,4653818 | |
| charconv + obuf_file | 0,6011 |
Tous les repères sont dans Benchmarks / 0014.file_io / file_io.
Sortie 100000000x "Hello World n"
Remarque: J'ai modifié Bufsiz de LiBSTDC ++ de LibSTDC ++ à 1048576 en raison de Bufsiz est trop petit (512 octets) pour MingW-W64 ou il fonctionne horriblement.
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | Msvcrt + libstdc ++ |
|---|---|---|---|
| Méthode | Temps de sortie | Commentaire |
|---|---|---|
| fwrite | 2.524001 | |
| fléau | 1.013001S | |
| fast_io :: obuf_file | 0,437998S | |
| fast_io :: obuf_file_mutex | 1.371 | Fitre en toute sécurité |
| fast_io :: c_file_unlocked | 1.164997S | J'ai piraté l'implémentation du fichier de MSVCRT * |
| fast_io :: c_file | 3.337945 | Filé en toute sécurité. J'ai piraté l'implémentation du fichier de MSVCRT *. Besoin d'une optimisation supplémentaire |
| fast_io :: filebuf_file | 0,467001 | J'ai piraté l'implémentation de libstdc ++ std :: filebuf |
| Plate-forme | Linux | GCC 11.0.0 | glibc + libstdc ++ |
|---|---|---|---|
| Méthode | Temps de sortie | Commentaire |
|---|---|---|
| fwrite | 1.457288317S | |
| fléau | 1.249783346S | |
| fast_io :: obuf_file | 0.494827134S | |
| fast_io :: obuf_file_mutex | 0.49713826S | Fitre en toute sécurité |
| fast_io :: c_file_unlocked | 0,687976666 | J'ai piraté le fichier de GLIBC * Implémentation |
| fast_io :: c_file | 0.910792697S | Filé en toute sécurité. J'ai piraté le fichier de GLIBC * Implémentation |
| fast_io :: filebuf_file | 0,526955039 | J'ai piraté l'implémentation de libstdc ++ std :: filebuf |
| Plate-forme | Fenêtre | MSVC 19.26.28805 | UCRT + MSVC STL |
|---|---|---|---|
| Méthode | Temps de sortie | Commentaire |
|---|---|---|
| fwrite | 3.3139122S | |
| fléau | 1.7184119S | |
| fast_io :: obuf_file | 0,7996034S | |
| fast_io :: obuf_file_mutex | 2.2949221 | Filé en toute sécurité. Il semble que STD :: Mutex est horriblement lent pour MSVC STL. |
| fast_io :: c_file_unlocked | 1.2103924S | J'ai piraté l'implémentation du fichier d'UCRT * |
| fast_io :: c_file | 2.3604295 | Filé en toute sécurité. J'ai piraté l'implémentation du fichier d'UCRT * |
| fast_io :: filebuf_file | 1.2805368S | J'ai piraté l'implémentation de MSVC STL STD :: FileBuf |
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | MSVCRT + LIBSTDC ++ + compilation statique |
|---|---|---|---|
| Méthode | Taille binaire | Commentaire |
|---|---|---|
| fléau | 925KB | Utilisez FSTREAM n'est pas bon pour votre santé car STD :: Locale gonfle votre binaire. |
| fast_io :: obuf_file | 155KB | |
| fast_io :: c_file_unlocked | 157KB | J'ai piraté l'implémentation du fichier de MSVCRT * |
| fast_io :: c_file | 157KB | Filé en toute sécurité. J'ai piraté l'implémentation du fichier de MSVCRT * |
| fast_io :: filebuf_file | 933KB | J'ai piraté l'implémentation de libstdc ++ STD :: FileBuf. Le flux C ++ est nul |
Générer 100000000? emojis en utilisant le programme dans Benchmarks / 0020.UTF / FILL_NC.CC
Les repères sont en exemples / 0043.ICONV IconV universel. (UTF-8 à GB18030 comme exemple) Test d'IconV:
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | Msvcrt + libstdc ++ |
|---|---|---|---|
| Méthode | Temps écoulé | Commentaire |
|---|---|---|
| commande iconv | 1,529 | |
| universel.cc | 1.293 | Utilisez POSIX LiBiConv |
Utf8-> utf16le
Les repères sont en exemples / 0022.Utf
Test d'icôve:
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | Msvcrt + libstdc ++ |
|---|---|---|---|
| Méthode | Temps écoulé | Commentaire |
|---|---|---|
| commande iconv | 0,967 | Iconv GNU. Pas de bom qui suce |
| utf8_file_to_utf16_file.cc | 0,498S | J'utilise les algorithmes SSE fournis par le projet UTF-UTILS. |
UTF8-> UTF32LE
Les repères sont en exemples / 0022.Utf
Test d'icôve:
| Plate-forme | Fenêtre | Mingw-W64 GCC 11.0.0 | Msvcrt + libstdc ++ |
|---|---|---|---|
| Méthode | Temps écoulé | Commentaire |
|---|---|---|
| commande iconv | 0,844 | Iconv GNU. Pas de bom qui suce |
| utf8_file_to_utf32_file.cc | 0,442 | J'utilise les algorithmes SSE fournis par le projet UTF-UTILS. |
La création et le développement de ce projet ont été rendus possibles grâce aux précieuses contributions de divers projets open source. Bien que le code n'ait pas été copié directement à partir de ces projets, je les ai utilisés comme références et je les ai réimplémentés en fonction des objectifs spécifiques de cette bibliothèque. Dans certains cas, des problèmes d'intégration sont survenus qui ont nécessité des modifications du code d'origine. Je suis reconnaissant à ces projets et à leurs développeurs pour leur engagement à rendre leur code ouvert et accessible à la communauté au sens large.
| Projet | URL |
|---|---|
| Grisu-exact | https://github.com/jk-jeon/grisu-exact |
| Ryu | https://github.com/ulfjack/ryu |
| Sha-intrinsics | 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 |
| Bibliothèque GNU C | https://www.gnu.org/software/libc/ |
| GNU Newlib | https://sourceware.org/newlib/ |
| Dragonbox | https://github.com/jk-jeon/dragonbox |
| Jeaiii | https://github.com/jeaiii/itoa |
| Crypto ++ | https://github.com/weidai11/cryptopp |
| Myitoa | https://gitee.com/xjkp2283572185/mystd |