Fast_io adalah perpustakaan input/output C ++ 20 yang memberikan kecepatan luar biasa dan dirancang untuk menggantikan pustaka <iostream> dan <cstdio> yang umum digunakan. Ini adalah perpustakaan header saja dan dilisensikan di bawah lisensi MIT, membuatnya mudah untuk dimasukkan dalam proyek apa pun. Namun, itu membutuhkan kompiler C ++ 20 yang mendukung konsep.
Repositori asli untuk Fast_io telah diarsipkan karena git kembung dari waktu ke waktu, tetapi komitmen yang lebih tua masih dapat ditemukan di sana. Komit lama ada di sini.
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
} Untuk contoh terbaru lainnya, silakan lihat examples/ folder.
Contoh -contoh yang sudah usang ada di sini tetapi mereka mungkin tidak berfungsi lagi.
Repo I18N ini menyimpan file sumber i18n.
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
Istilah fast in fast_io tidak selalu menyiratkan bahwa itu adalah pustaka input/output tercepat yang tersedia (karena akan disebut sebagai fastest_io sebagai gantinya). Sebaliknya, istilah ini mengacu pada fakta bahwa fast_io terutama lebih cepat daripada <iostream> dan <cstdio> perpustakaan dalam semua kasus.
Lihat Support.md untuk daftar hal -hal yang didukung dan catatan penggunaan spesifik platform.
Anda dapat mengajukan pertanyaan di Fast_io Discord Server atau QQ Group: 801441303 .
Lihat https://ewindy.gitee.io/fast_io_rst/index.html atau https://gitee.com/qabeowjbtkwb/fast_io/wikis.
Sedekat mungkin dengan panggilan sistem.
Dukungan UNICODE (UTF-8, UTF-16, UTF-32) + CODECVT untuk GB18030 dan UTF-EBCDIC (No Libc dengan benar menanganinya)
RAII untuk FILE* , POSIX fd dan WIN32/NT HANDLE
Interop dengan <cstdio> dan <iostream>
Tidak ada hal yang mudah disalahgunakan seperti std::endl
Manipulator I/O statis alih -alih string format.
Lokal opsional.
Manipulasi I/O tanpa kewarganegaraan.
Penanganan kesalahan yang konsisten; Jika tersedia, pengecualian sebagai satu -satunya mekanisme pelaporan kesalahan (tidak ada std::error_code , std::system_error atau pemeriksaan batas yang tidak berguna)
Mode berdiri bebas.
Alamat kode khusus pembersih untuk melindungi masalah keselamatan memori.
Dukungan Instrumentasi Dinamis
Mendukung POSIX ICONV. Anda dapat menggunakan Fast_io untuk konversi pengkodean Anda.
Serialisasi biner untuk jenis yang dapat disalin secara sepele dan wadah standar
Bermain dengan baik dengan wadah C ++ ( std::vector<fast_io::obuf_file>
Format dasar/lua/python/etc (cetak, pemindaian). Tidak ada dukungan untuk C dan C ++ karena mereka adalah bahaya keamanan.
Menyediakan API untuk mengekspos implementasi internal FILE* dan C ++ stream.
Antarmuka pegangan asli
Sangat mudah untuk mendukung perangkat khusus
Gaya C dan C ++ Compile Time Open Mode Parsing.
Tidak ada traits_type dan EOF
Dukungan Jenis Dinamis
Multi proses
Pemetaan Memori
Debugging IO (opsional dengan GUI)
Algoritma Floating Point Bulat
Dukungan algoritma hash: SHA-1 intrinsik, HMAC-SHA1 intrinsik, intrinsik SHA-256, HMAC-SHA256 intrinsik, SHA-512, HMAC-SHA512 serta algoritma hash non-kripto, seperti Jenkins Hash.
Kompresi/dekompresi zlib
Sistem file
OpenSSL Bio, Qt QFile, Dukungan MFC CFILE
Sasaran: Cetak sepuluh juta bilangan bulat dari 0 hingga 10 juta untuk mengajukan. Kemudian buka kembali file itu untuk memindai kembali.
Semua tolok ukur ada dalam tolok ukur/0000.10m_size_t/unit.
PEMBERITAHUAN: Saya memodifikasi libstdc ++ Bufsiz 1048576 karena Bufsiz terlalu kecil (512 byte) untuk Mingw-W64, atau berkinerja buruk.
| Platform | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu output | Waktu input | Komentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 2.412987S | 5.607791S | |
| fstream | 0.462012S | 1.192S | |
| FStream dengan trik rdbuf.sputc | 0.33895S | 1.170173S | |
| fast_io :: i/obuf_file | 0,04903S | 0,080996S | |
| fast_io :: i/obuf_file_mutex | 0.146064S | 0.113155S | Thread aman |
| c_locale_i/obuf_file ("c") | 0,065988S | 0,086012S | diilhami dengan lokal, lokal "C" |
| C_LOCALE_I/OBUF_FILE Lokal | 0.153995S | diilhami dengan lokal, lokal "" | |
| fmt :: format_int+obuf_file | 0.122999S | ||
| fmt :: format_int+ofstream | 0.209055S | ||
| fmt :: format+ofstream | 0,548S | FMT membuat segalanya lebih lambat | |
| fmt :: cetak | 0.663996S | FMT membuat segalanya lebih lambat | |
| std :: to_chars+obuf_file | 0,12S | ||
| std :: to_chars+ofstream | 0.192 | ||
| fast_io :: c_file_unlocked | 0,098999S | 0.126003S | Saya meretas file msvcrt* implementasi |
| fast_io :: c_file | 0.298988S | 0.318001S | Thread aman. Saya meretas file msvcrt* implementasi |
| Fast_io :: FileBuf_File | 0,048999S | 0,081S | Saya meretas implementasi streambuf/filebuf libstdc ++ |
| fast_io :: iobuf_utf8_file_char16 | 0.124S | 0.112001S | UTF-16 => UTF-8 dengan SSE |
| fast_io :: iobuf_utf8_file_char32 | 0.110999S | 0.111011S | UTF-32 => UTF-8 dengan SSE |
| std :: wofstream | 2.64S | 3.843735S | wofstream dengan std :: locale codecvt. TBH yang sangat lambat. |
| fast_io :: wfilebuf_io_observer | 2.415692S | 2.497704S | wofstream dengan std :: locale codecvt. Ini membuktikan fstream tidak akan pernah bisa diperbaiki. |
| Bahasa karat | 0.483S | Karat lambat. Rust juga tidak berurusan dengan lokal. Pikirkan betapa buruknya itu. | |
| Perpustakaan Rust Itoa 0.4.6 | > 0,165S | Saya mengabaikan bagian n untuk itu untuk memastikan tidak ada bias. |
Bahasa karat 10x lebih lambat dari fast_io. + Perpustakaan Binary Bloat dan Itoa masih sangat lambat dan dapat digunakan untuk saya. Setidaknya 3x lebih lambat dari fast_io.
Jalankan tes yang sama pada MSVC 19.26.28805.
| Platform | Windows | MSVC 19.26.28805 | Instal FMTlib Wastes WAKTU HIDUP SAYA |
|---|---|---|---|
| Metode | Waktu output | Waktu input | Komentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 1.5353597S | 1.4157233S | |
| fstream | 3.6350262S | 3.8420339S | |
| FStream dengan trik rdbuf.sputc | 3.3735902S | 3.8145566S | |
| fast_io :: i/obuf_file | 0,0631433S | 0.1030554S | |
| fast_io :: i/obuf_file_mutex | 0.2190659S | 0.2485886S | Thread aman |
| std :: to_chars+obuf_file | 0.1641641S | ||
| std :: to_chars+ofstream | 0,5461922S | ||
| fast_io :: c_file_unlocked | 0.1102575S | 0.2399757S | Saya meretas file universal crt* implementasi |
| fast_io :: c_file | 0.2034755S | 0.2621148S | Thread aman. Saya meretas file uccrt* implementasi |
| Fast_io :: FileBuf_File | 0.126661S | 0.2378803S | Saya meretas implementasi streambuf/filebuf MSVC STL |
Jalankan tes yang sama pada GCC 11. GLIBC+ LIBSTDC ++
| Platform | Linux | GCC 11.0.0 | GLIBC+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu output | Waktu input | Komentar |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 0,532792935S | 0.591907111S | |
| FStream dengan trik rdbuf.sputc | 0.318896068S | 0.429406415S | |
| fast_io :: i/obuf_file | 0.050300857S | 0,065372395S | |
| fast_io :: i/obuf_file_mutex | 0,05290654S | 0,083040518S | Thread aman |
| c_locale_i/obuf_file ("c") | 0,051939052S | 0.065820056S | diilhami dengan lokal, lokal "C" |
| C_LOCALE_I/OBUF_FILE Lokal | 0.162406082S | diilhami dengan lokal, lokal "" | |
| std :: to_chars+obuf_file | 0.115453587S | ||
| fmt :: format_int+obuf_file | 0.1183587S | ||
| fmt :: format_int+ofstream | 0.195914384S | ||
| fmt :: format+ofstream | 0.633590975S | FMT membuat segalanya lebih lambat | |
| fmt :: cetak | 0.495270371S | FMT membuat segalanya lebih lambat | |
| Boost :: iostreams | 0.400906063S | 0.444717051S | Menggunakan boost ioStreams tidak membuat kode Anda lebih cepat |
| fast_io :: c_file_unlocked | 0,060076723S | 0,073299716S | Saya meretas file GLIBC* Implementasi |
| fast_io :: c_file | 0,092490191S | 0.104545535S | Thread aman. Saya meretas file GLIBC* Implementasi |
| Fast_io :: FileBuf_File | 0,052251608S | 0,06655806S | Saya meretas implementasi streambuf/filebuf libstdc ++ |
Anda dapat melihat Fast_io juga dapat meningkatkan kinerja fasilitas yang ada untuk 10x! Ya, bahkan dapat meningkatkan kinerja file* dan fstream untuk 10x tergantung pada platform karena saya menggunakan konsep untuk abstrak semuanya. FMTLIB sebenarnya memperlambat kinerja I/O.
Kami hanya melakukan tes ini untuk MSVC karena hanya MSVC's CharconV yang mengimplementasikannya. Ya. Fast_io mengalahkan CharconV MSVC untuk lebih dari 20% karena menjalankan algoritma yang sama.
Semua tolok ukur ada dalam tolok ukur/0001.10m_double/charconv.
Jalankan tes yang sama pada MSVC 19.26.28805.
| Platform | Windows | MSVC 19.26.28805 | |
|---|---|---|---|
| Metode | Waktu output | Komentar |
|---|---|---|
| I/OBUF_FILE | 0.4653818S | |
| Charconv + OBUF_FILE | 0.6011 |
Semua tolok ukur ada dalam tolok ukur/0014.file_io/file_io.
Output 100000000x "halo dunia n"
PEMBERITAHUAN: Saya memodifikasi libstdc ++ std :: FileBuf's Bufsiz ke 1048576 karena Bufsiz terlalu kecil (512 byte) untuk Mingw-W64 atau berkinerja buruk.
| Platform | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu output | Komentar |
|---|---|---|
| fwrite | 2.524001S | |
| fstream | 1.013001S | |
| fast_io :: OBUF_FILE | 0.437998S | |
| fast_io :: OBUF_FILE_MUTEX | 1.371S | Thread aman |
| fast_io :: c_file_unlocked | 1.164997S | Saya meretas file msvcrt* implementasi |
| fast_io :: c_file | 3.337945S | Thread aman. Saya meretas file MSVCRT* Implementasi. Perlu optimasi lebih lanjut |
| Fast_io :: FileBuf_File | 0.467001S | I Hacked Libstdc ++'s Std :: FileBuf Implementasi |
| Platform | Linux | GCC 11.0.0 | GLIBC+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu output | Komentar |
|---|---|---|
| fwrite | 1.457288317S | |
| fstream | 1.249783346S | |
| fast_io :: OBUF_FILE | 0.494827134S | |
| fast_io :: OBUF_FILE_MUTEX | 0.497138826S | Thread aman |
| fast_io :: c_file_unlocked | 0.687976666S | Saya meretas file GLIBC* Implementasi |
| fast_io :: c_file | 0.910792697S | Thread aman. Saya meretas file GLIBC* Implementasi |
| Fast_io :: FileBuf_File | 0.526955039S | I Hacked Libstdc ++'s Std :: FileBuf Implementasi |
| Platform | Windows | MSVC 19.26.28805 | UCRT + MSVC STL |
|---|---|---|---|
| Metode | Waktu output | Komentar |
|---|---|---|
| fwrite | 3.3139122S | |
| fstream | 1.7184119S | |
| fast_io :: OBUF_FILE | 0.7996034S | |
| fast_io :: OBUF_FILE_MUTEX | 2.2949221S | Thread aman. Sepertinya std :: mutex sangat lambat untuk msvc stl. |
| fast_io :: c_file_unlocked | 1.2103924S | Saya meretas file uccrt* implementasi |
| fast_io :: c_file | 2.3604295S | Thread aman. Saya meretas file uccrt* implementasi |
| Fast_io :: FileBuf_File | 1.2805368S | Saya meretas implementasi MSVC STL :: FileBuf MSVC |
| Platform | Windows | MINGW-W64 GCC 11.0.0 | Msvcrt + libstdc ++ + kompilasi statis |
|---|---|---|---|
| Metode | Ukuran biner | Komentar |
|---|---|---|
| fstream | 925KB | Gunakan fStream tidak baik untuk kesehatan Anda karena std :: locale bloats biner Anda. |
| fast_io :: OBUF_FILE | 155kb | |
| fast_io :: c_file_unlocked | 157KB | Saya meretas file msvcrt* implementasi |
| fast_io :: c_file | 157KB | Thread aman. Saya meretas file msvcrt* implementasi |
| Fast_io :: FileBuf_File | 933KB | Saya meretas implementasi libstdc ++ std :: FileBuf. C ++ Stream menyebalkan |
Menghasilkan 100000000? emoji dengan menggunakan program dalam tolok ukur/0020.utf/fill_nc.cc
Tolok ukur ada dalam contoh/0043.iconv universal iconv. (UTF-8 ke GB18030 sebagai contoh) Tes ICONV:
| Platform | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu yang berlalu | Komentar |
|---|---|---|
| Perintah ICONV | 1.529S | |
| universal.cc | 1.293S | Gunakan POSIX LIBICONV |
UTF8-> UTF16LE
Tolok ukur ada dalam contoh/0022.utf
Tes ICONV:
| Platform | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu yang berlalu | Komentar |
|---|---|---|
| Perintah ICONV | 0.967 | ICONV GNU. Tidak ada bom yang menyebalkan |
| UTF8_FILE_TO_UTF16_FILE.CC | 0.498S | Saya menggunakan algoritma SSE yang disediakan oleh proyek UTF-UTILS. |
UTF8-> UTF32LE
Tolok ukur ada dalam contoh/0022.utf
Tes ICONV:
| Platform | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| Metode | Waktu yang berlalu | Komentar |
|---|---|---|
| Perintah ICONV | 0.844S | ICONV GNU. Tidak ada bom yang menyebalkan |
| UTF8_FILE_TO_UTF32_FILE.CC | 0.442S | Saya menggunakan algoritma SSE yang disediakan oleh proyek UTF-UTILS. |
Penciptaan dan pengembangan proyek ini dimungkinkan berkat kontribusi berharga dari berbagai proyek open-source. Sementara kode tidak disalin langsung dari proyek-proyek ini, saya menggunakannya sebagai referensi dan menerapkannya kembali agar sesuai dengan tujuan spesifik perpustakaan ini. Dalam beberapa kasus, masalah integrasi muncul yang membutuhkan modifikasi pada kode asli. Saya berterima kasih kepada proyek -proyek ini dan pengembang mereka atas komitmen mereka untuk membuat kode mereka terbuka dan dapat diakses oleh komunitas yang lebih luas.
| Proyek | Url |
|---|---|
| Grisu-Exact | 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 |
| Perpustakaan 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 |