FAST_IOは、例外的な速度を提供するC ++ 20入力/出力ライブラリであり、一般的に使用される<iostream>および<cstdio>ライブラリを置き換えるように設計されています。これはヘッダーのみのライブラリであり、MITライセンスの下でライセンスされているため、あらゆるプロジェクトに簡単に含めることができます。ただし、概念をサポートするC ++ 20コンパイラが必要です。
Fast_ioの元のリポジトリは、時間の経過とともにGit肥大化のためにアーカイブされていますが、古いコミットはまだそこにあります。古いコミットはここにありました。
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
}他の最新の例については、 examples/フォルダーをご覧ください。
非推奨の例はここにありますが、それらはもう機能しないかもしれません。
このi18nリポジトリは、i18nソースファイルを保存します。
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
fast_ioのfastという用語は、それが利用可能な最速の入力/出力ライブラリであることを必ずしも意味するわけではありません(代わりにfastest_ioとして名前が付けられていたため)。代わりに、この用語は、 fast_ioすべての場合に<iostream>および<cstdio>ライブラリよりも著しく高速であるという事実を指します。
サポートされているものとプラットフォーム固有の使用法のリストについては、support.mdを参照してください。
Fast_io Discord ServerまたはQQグループ: 801441303で質問することができます。
https://ewindy.gitee.io/fast_io_rst/index.htmlまたはhttps://gitee.com/qabeowjbtkwb/fast_io/wikisを参照してください。
システムコールにできるだけ近く。
Unicode Support(UTF-8、UTF-16、UTF-32) + GB18030およびUTF-EBCDICのCodeCVT(LIBCは正しく対処していません)
c FILE* 、posix fd 、win32/nt HANDLE
<cstdio>および<iostream>との相互作用
std::endlような簡単に誤用されたものはありません
形式の文字列ではなく静的I/Oマニピュレーター。
オプションのロケール。
ステートレスI/O操作。
一貫したエラー処理;利用可能な場合、例外としての唯一のエラー報告メカニズムとしての例外( std::error_code 、 std::system_errorまたは役に立たないバウンドチェック)として)
自立モード。
メモリ安全性の問題を保護するためのサニタイザー特別コードに対処します。
動的な計装サポート
POSIX ICONVをサポートします。 Coding Conversionにはfast_ioを使用できます。
些細なコピー可能なタイプと標準コンテナのバイナリシリアル化
C ++コンテナでよく再生します(例std::vector<fast_io::obuf_file>が有効です)
BASIC/LUA/Python/etc形式(印刷、スキャン)。セキュリティの危険であるため、CおよびC ++のサポートはありません。
APIを提供して、 FILE*およびC ++ストリームの内部実装を公開します。
ネイティブハンドルインターフェイス
カスタムデバイスを非常に簡単にサポートできます
CおよびC ++スタイルコンパイル時間オープンモードの解析。
traits_typeはありませEOF
動的タイプのサポート
マルチプロセス
メモリマッピング
IOのデバッグ(オプションでGUIを使用)
往復フローティングポイントアルゴリズム
ハッシュアルゴリズムのサポート:固有のSHA-1、固有のHMAC-SHA1、固有のSHA-256、固有のHMAC-SHA256、SHA-512、HMAC-SHA512、およびJenkins Hashなどの非暗号ハッシュアルゴリズム。
Zlib圧縮/減圧
ファイルシステム
OpenSSL Bio、QT QFile、MFC CFILEサポート
目標:0〜10mで1,000万インクを印刷してファイルします。次に、そのファイルを再開してスキャンします。
すべてのベンチマークは、ベンチマーク/0000.10m_size_t/unitにあります。
通知:BufsizのためにLibstdc ++のBufsiz 1048576を変更しました。MINGW-W64には小さすぎる(512バイト)、または恐ろしく機能します。
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| 方法 | 出力時間 | 入力時間 | コメント |
|---|---|---|---|
| stdio.h(fprintf/fscanf) | 2.412987S | 5.607791S | |
| fstream | 0.462012S | 1.192s | |
| rdbuf.sputcトリックを備えたfstream | 0.33895S | 1.170173S | |
| fast_io :: i/obuf_file | 0.04903S | 0.080996S | |
| fast_io :: i/obuf_file_mutex | 0.146064S | 0.113155S | 安全なスレッド |
| c_locale_i/obuf_file( "c") | 0.065988S | 0.086012S | ロケール、ロケール「C」が染み込んでいます |
| c_locale_i/obuf_fileローカル | 0.153995S | ロケール、ロケール「」が染み込んでいます | |
| fmt :: format_int+obuf_file | 0.122999S | ||
| fmt :: format_int+ofstream | 0.209055S | ||
| fmt :: format+ofstream | 0.548s | FMTは物事を遅くします | |
| FMT ::印刷 | 0.663996S | FMTは物事を遅くします | |
| std :: to_chars+obuf_file | 0.12s | ||
| std :: to_chars+ofstream | 0.192S | ||
| fast_io :: c_file_unlocked | 0.098999S | 0.126003S | MSVCRTのファイル*実装をハッキングしました |
| fast_io :: c_file | 0.298988S | 0.318001S | 安全なスレッド。 MSVCRTのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 0.048999S | 0.081S | libstdc ++のstreambuf/filebuf実装をハッキングしました |
| fast_io :: iobuf_utf8_file_char16 | 0.124s | 0.112001S | UTF-16 => SSEを使用したUTF-8 |
| fast_io :: iobuf_utf8_file_char32 | 0.110999S | 0.111011S | UTF-32 => SSE付きUTF-8 |
| std :: wofstream | 2.64s | 3.843735S | wofstream with std :: locale codecvt。非常に遅いTBH。 |
| fast_io :: wfilebuf_io_observer | 2.415692S | 2.497704S | wofstream with std :: locale codecvt。これは、FSTREAMが修正されないことを証明しています。 |
| さび語 | 0.483S | 錆が遅いです。また、錆はロケールを扱っていません。それがどれほど悪いかを考えてください。 | |
| Rust Itoa Library 0.4.6 | > 0.165S | バイアスを確保するために、 n部分を無視しました。 |
錆言語は、fast_ioより10倍遅いです。 +バイナリの膨満感と伊藤ライブラリは、私にとって非常に遅く、使いやすいです。 Fast_ioより少なくとも3倍遅いです。
MSVC 19.26.28805で同じテストを実行します。
| プラットフォーム | Windows | MSVC 19.26.28805 | 私の人生の時間を廃棄するfmtlibをインストールしてください |
|---|---|---|---|
| 方法 | 出力時間 | 入力時間 | コメント |
|---|---|---|---|
| stdio.h(fprintf/fscanf) | 1.5353597S | 1.4157233S | |
| fstream | 3.6350262S | 3.8420339S | |
| rdbuf.sputcトリックを備えたfstream | 3.3735902S | 3.8145566S | |
| fast_io :: i/obuf_file | 0.0631433S | 0.1030554S | |
| fast_io :: i/obuf_file_mutex | 0.2190659S | 0.2485886S | 安全なスレッド |
| std :: to_chars+obuf_file | 0.1641641S | ||
| std :: to_chars+ofstream | 0.5461922S | ||
| fast_io :: c_file_unlocked | 0.1102575S | 0.2399757S | Universal CRTのファイル*実装をハッキングしました |
| fast_io :: c_file | 0.2034755S | 0.2621148S | 安全なスレッド。 UCRTのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 0.126661S | 0.2378803S | MSVC STLのStreamBuf/FileBuf実装をハッキングしました |
GCC 11で同じテストを実行します。Glibc+ libstdc ++
| プラットフォーム | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| 方法 | 出力時間 | 入力時間 | コメント |
|---|---|---|---|
| stdio.h(fprintf/fscanf) | 0.532792935S | 0.591907111S | |
| rdbuf.sputcトリックを備えたfstream | 0.318896068S | 0.429406415S | |
| fast_io :: i/obuf_file | 0.050300857S | 0.065372395S | |
| fast_io :: i/obuf_file_mutex | 0.05290654S | 0.083040518S | 安全なスレッド |
| c_locale_i/obuf_file( "c") | 0.051939052S | 0.065820056S | ロケール、ロケール「C」が染み込んでいます |
| c_locale_i/obuf_fileローカル | 0.162406082S | ロケール、ロケール「」が染み込んでいます | |
| 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は物事を遅くします | |
| FMT ::印刷 | 0.495270371S | FMTは物事を遅くします | |
| ブースト:: ioStreams | 0.400906063S | 0.444717051S | ブーストioStreamsを使用しても、コードが高速になりません |
| fast_io :: c_file_unlocked | 0.060076723S | 0.073299716S | Glibcのファイル*実装をハッキングしました |
| fast_io :: c_file | 0.092490191S | 0.104545535S | 安全なスレッド。 Glibcのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 0.052251608S | 0.06655806S | libstdc ++のstreambuf/filebuf実装をハッキングしました |
fast_ioは、既存の施設のパフォーマンスを10倍に向上させることもできます。はい、概念を使用してすべてを抽象化するため、プラットフォームに応じて10倍のファイル*とFSTREAMのパフォーマンスを改善することもできます。 FMTLIBは実際にI/Oパフォーマンスを遅くします。
MSVCのCharConvのみが実装するため、MSVCのこのテストのみを実行します。はい。 Fast_ioは、同じアルゴリズムを実行してMSVCのCharConvを20%以上倒します。
すべてのベンチマークはベンチマーク/0001.10m_double/charconvにあります。
MSVC 19.26.28805で同じテストを実行します。
| プラットフォーム | Windows | MSVC 19.26.28805 | |
|---|---|---|---|
| 方法 | 出力時間 | コメント |
|---|---|---|
| i/obuf_file | 0.4653818S | |
| charconv + obuf_file | 0.6011S |
すべてのベンチマークはベンチマーク/0014.file_io/file_ioにあります。
出力100000000X「Hello World n」
注意:私はlibstdc ++のs std :: filebufのbufsizを1048576に変更しました。
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| 方法 | 出力時間 | コメント |
|---|---|---|
| fwrite | 2.524001S | |
| fstream | 1.013001S | |
| fast_io :: obuf_file | 0.437998S | |
| fast_io :: obuf_file_mutex | 1.371S | 安全なスレッド |
| fast_io :: c_file_unlocked | 1.164997S | MSVCRTのファイル*実装をハッキングしました |
| fast_io :: c_file | 3.337945S | 安全なスレッド。 MSVCRTのファイル*実装をハッキングしました。さらに最適化する必要があります |
| fast_io :: filebuf_file | 0.467001S | libstdc ++のs std :: filebuf実装をハッキングしました |
| プラットフォーム | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| 方法 | 出力時間 | コメント |
|---|---|---|
| fwrite | 1.457288317S | |
| fstream | 1.249783346S | |
| fast_io :: obuf_file | 0.494827134S | |
| fast_io :: obuf_file_mutex | 0.497138826S | 安全なスレッド |
| fast_io :: c_file_unlocked | 0.687976666S | Glibcのファイル*実装をハッキングしました |
| fast_io :: c_file | 0.910792697S | 安全なスレッド。 Glibcのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 0.526955039S | libstdc ++のs std :: filebuf実装をハッキングしました |
| プラットフォーム | Windows | MSVC 19.26.28805 | UCRT + MSVC STL |
|---|---|---|---|
| 方法 | 出力時間 | コメント |
|---|---|---|
| fwrite | 3.3139122S | |
| fstream | 1.7184119S | |
| fast_io :: obuf_file | 0.7996034S | |
| fast_io :: obuf_file_mutex | 2.2949221S | 安全なスレッド。 STD :: MutexはMSVC STLではひどく遅いようです。 |
| fast_io :: c_file_unlocked | 1.2103924S | UCRTのファイル*実装をハッキングしました |
| fast_io :: c_file | 2.3604295S | 安全なスレッド。 UCRTのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 1.2805368S | MSVC STLのSTD :: FileBuf実装をハッキングしました |
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT + LIBSTDC ++ +静的コンパイル |
|---|---|---|---|
| 方法 | バイナリサイズ | コメント |
|---|---|---|
| fstream | 925kb | FSTREAMを使用すると、std :: localeがバイナリが膨らんでいるため、健康には良くありません。 |
| fast_io :: obuf_file | 155kb | |
| fast_io :: c_file_unlocked | 157kb | MSVCRTのファイル*実装をハッキングしました |
| fast_io :: c_file | 157kb | 安全なスレッド。 MSVCRTのファイル*実装をハッキングしました |
| fast_io :: filebuf_file | 933kb | libstdc ++のs std :: filebuf実装をハッキングしました。 C ++ストリームは吸う |
100000000を生成しますか?ベンチマーク/0020.utf/fill_nc.ccでプログラムを使用して絵文字
ベンチマークは例/0043.ICONVユニバーサルICONVにあります。 (例としてUTF-8からGB18030からGB18030から)ICONVテスト:
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| 方法 | 経過時間 | コメント |
|---|---|---|
| ICONVコマンド | 1.529S | |
| Universal.cc | 1.293S | posix libiconvを使用します |
utf8-> utf16le
ベンチマークは例/0022.UTFにあります
ICONVテスト:
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| 方法 | 経過時間 | コメント |
|---|---|---|
| ICONVコマンド | 0.967S | GNU ICONV。吸うボムはありません |
| utf8_file_to_utf16_file.cc | 0.498S | UTF-UTILSプロジェクトによって提供されるSSEアルゴリズムを使用しています。 |
UTF8-> UTF32LE
ベンチマークは例/0022.UTFにあります
ICONVテスト:
| プラットフォーム | Windows | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| 方法 | 経過時間 | コメント |
|---|---|---|
| ICONVコマンド | 0.844s | GNU ICONV。吸うボムはありません |
| utf8_file_to_utf32_file.cc | 0.442s | UTF-UTILSプロジェクトによって提供されるSSEアルゴリズムを使用しています。 |
このプロジェクトの作成と開発は、さまざまなオープンソースプロジェクトの貴重な貢献のおかげで可能になりました。コードはこれらのプロジェクトから直接コピーされていませんが、私はそれらを参照として使用し、このライブラリの特定の目的に合わせてそれらを再実装しました。場合によっては、元のコードの変更が必要な統合の問題が発生しました。これらのプロジェクトとその開発者が、コードをオープンにし、より広いコミュニティにアクセスできるようにしてくれたことに感謝しています。
| プロジェクト | URL |
|---|---|
| grisu-exact | https://github.com/jk-jeon/grisu-exact |
| リュウ | 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 |
| GNU Cライブラリ | https://www.gnu.org/software/libc/ |
| GNU Newlib | https://sourceware.org/newlib/ |
| ドラゴンボックス | https://github.com/jk-jeon/dragonbox |
| jeaiii | https://github.com/jeaiii/itoa |
| 暗号++ | https://github.com/weidai11/cryptopp |
| myitoa | https://gitee.com/xjkp2283572185/mystd |