Fast_io هي مكتبة إدخال/إخراج C ++ 20 التي توفر سرعة استثنائية وهي مصممة لاستبدال مكتبات <iostream> و <cstdio> المستخدمة بشكل شائع. إنها مكتبة رأس فقط وهي مرخصة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا ، مما يسهل تضمينه في أي مشروع. ومع ذلك ، فإنه يتطلب برنامج التحويل البرمجي 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 REPO يخزن ملفات المصدر I18N.
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
لا يعني المصطلح fast in fast_io بالضرورة أنه أسرع مكتبة إدخال/إخراج متوفرة (حيث كان من الممكن تسميتها على أنها fastest_io بدلاً من ذلك). بدلاً من ذلك ، يشير المصطلح إلى حقيقة أن fast_io أسرع بشكل ملحوظ من مكتبات <iostream> و <cstdio> في جميع الحالات.
انظر Support.md للحصول على قائمة بالأشياء المدعومة وملاحظات الاستخدام المحددة للمنصة.
يمكنك طرح أسئلة على خادم Discord Fast_io أو مجموعة QQ: 801441303 .
انظر إما https://ewindy.gitee.io/fast_io_rst/index.html أو https://gitee.com/qabeowjbtkwb/fast_io/wikis.
في أقرب وقت ممكن من استدعاء النظام.
دعم UNICODE (UTF-8 ، UTF-16 ، UTF-32) + CODECVT لـ GB18030 و UTF-EBCDIC (لا يتناوله LIBC بشكل صحيح)
Raii for c FILE* ، posix fd و win32/nt HANDLE
interop مع <cstdio> و <iostream>
لا يسهل إساءة استخدام أشياء مثل std::endl
متاجر I/O ثابت بدلاً من سلاسل التنسيق.
لغة اختيارية.
معالجة I/O عديمة الجنسية.
معالجة الأخطاء المتسقة ؛ عند توفرها ، استثناءات كآلية الإبلاغ عن الخطأ الوحيدة (لا يوجد std::error_code أو std::system_error أو تحقق من الحدود غير المجدية)
وضع القائم بذاته.
عنوان معقم رمز خاص لحماية مشكلات سلامة الذاكرة.
دعم الأجهزة الديناميكية
يدعم POSIX ICONV. يمكنك استخدام Fast_io لتحويل الترميز الخاص بك.
التسلسل الثنائي لأنواع قابلة للنسخ وحاويات قياسية
يلعب بشكل جيد مع حاويات C ++ (على سبيل المثال std::vector<fast_io::obuf_file> صالحة)
تنسيق أساسي/لوا/بيثون/إلخ (الطباعة ، المسح). لا يوجد دعم لـ C و C ++ لأنهما مخاطر أمان.
توفير واجهات برمجة التطبيقات لفضح التنفيذ الداخلي FILE* و C ++.
واجهة المقبض الأصلي
من السهل للغاية دعم الأجهزة المخصصة
C و C ++ نمط التجميع وقت فتح وضع فتح.
لا traits_type و EOF
دعم النوع الديناميكي
عملية متعددة
رسم خرائط الذاكرة
تصحيح IO (اختياريا مع واجهة المستخدم الرسومية)
خوارزمية نقطة عائمة ذهابا وإيابا
دعم خوارزميات التجزئة: الجوهرية SHA-1 ، HMAC-SHA1 الجوهرية ، SHA-256 الجوهرية ، HMAC-SHA256 ، SHA-512 ، HMAC-SHA512 وكذلك خوارزميات هاشش غير المشفرة ، مثل جينكينز هاش.
ضغط Zlib/إلغاء الضغط
نظام الملفات
Openssl Bio ، Qt Qfile ، دعم MFC CFILE
الهدف: طباعة عشرة ملايين أعداد صحيحة من 0 إلى 10 أمتار إلى ملف. ثم أعد فتح هذا الملف للمسح مرة أخرى.
جميع المعايير في المعايير/0000.10m_size_t/الوحدة.
إشعار: لقد قمت بتعديل LibStdc ++ من Bufsiz 1048576 بسبب Bufsiz صغير جدًا (512 بايت) لـ Mingw-W64 ، أو يعمل بشكل فظيع.
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| طريقة | وقت الإخراج | وقت الإدخال | تعليق |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 2.412987s | 5.607791S | |
| fstream | 0.462012S | 1.192s | |
| fstream مع خدعة 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 | موضوع آمن |
| C_LOCALE_I/OBUF_FILE ("C") | 0.065988S | 0.086012S | مشبع بالمحطة ، لغة "ج" |
| C_LOCALE_I/OBUF_FILE LOCAL | 0.153995S | مشبعة بالمحطة ، لغة "" | |
| fmt :: format_int+obuf_file | 0.122999s | ||
| fmt :: format_int+ofstream | 0.209055S | ||
| FMT :: Format+ofstream | 0.548s | FMT يجعل الأمور أبطأ | |
| fmt :: print | 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 => UTF-8 مع SSE |
| fast_io :: iobuf_utf8_file_char32 | 0.110999S | 0.111011S | UTF-32 => UTF-8 مع SSE |
| std :: wofstream | 2.64s | 3.843735S | wofstream مع std :: locale codecvt. بطيء للغاية TBH. |
| fast_io :: wfilebuf_io_observer | 2.415692S | 2.497704S | wofstream مع std :: locale codecvt. هذا يثبت أن fstream لا يمكن أن يتم إصلاحه. |
| لغة الصدأ | 0.483s | الصدأ بطيء. أيضا الصدأ لا يتعامل مع اللغة. فكر في مدى سوء الأمر. | |
| مكتبة Rust Itoa 0.4.6 | > 0.165s | لقد تجاهلت الجزء n لذلك لضمان عدم وجود تحيز. |
لغة الصدأ أبطأ 10x من Fast_io. + لا تزال مكتبة Binary Bloat و ITOA بطيئة للغاية وقابلة للاستخدام بالنسبة لي. إنه أبطأ على الأقل 3x من Fast_io.
قم بإجراء نفس الاختبار على MSVC 19.26.28805.
| منصة | النوافذ | MSVC 19.26.28805 | تثبيت FMTLIB نفايات الوقت من حياتي |
|---|---|---|---|
| طريقة | وقت الإخراج | وقت الإدخال | تعليق |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 1.5353597s | 1.4157233S | |
| fstream | 3.6350262S | 3.8420339S | |
| fstream مع خدعة 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 | موضوع آمن |
| 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 STL |
قم بإجراء نفس الاختبار على GCC 11. GLIBC+ LIBSTDC ++
| منصة | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| طريقة | وقت الإخراج | وقت الإدخال | تعليق |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 0.532792935S | 0.591907111S | |
| fstream مع خدعة 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 | موضوع آمن |
| C_LOCALE_I/OBUF_FILE ("C") | 0.051939052S | 0.065820056S | مشبع بالمحطة ، لغة "ج" |
| C_LOCALE_I/OBUF_FILE LOCAL | 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 :: print | 0.495270371S | FMT يجعل الأمور أبطأ | |
| Boost :: iostreams | 0.400906063S | 0.444717051S | استخدام Boost 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 يمكن أيضًا تعزيز أداء المرافق الحالية لـ 10x! نعم ، يمكن أن يحسن الملف* وأداء FStream لـ 10x اعتمادًا على المنصات لأنني أستخدم المفاهيم لتجريدها جميعًا. FMTLIB يبطئ في الواقع أداء I/O.
نقوم فقط بإجراء هذا الاختبار لـ MSVC لأن MSVC فقط من MSVC ينفذه. نعم. Fast_io يهزم MSVC's Charconv لأكثر من 20 ٪ لتشغيل نفس الخوارزمية.
جميع المعايير في المعايير/0001.10m_double/charconv.
قم بإجراء نفس الاختبار على MSVC 19.26.28805.
| منصة | النوافذ | 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's bufsiz إلى 1048576 بسبب أن Bufsiz صغير جدًا (512 بايت) لـ Mingw-W64 أو يعمل بشكل فظيع.
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| طريقة | وقت الإخراج | تعليق |
|---|---|---|
| في الكتابة | 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 ++ STD :: FileBuf |
| منصة | Linux | GCC 11.0.0 | glibc+ libstdc ++ |
|---|---|---|---|
| طريقة | وقت الإخراج | تعليق |
|---|---|---|
| في الكتابة | 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 ++ STD :: FileBuf |
| منصة | النوافذ | MSVC 19.26.28805 | UCRT + MSVC STL |
|---|---|---|---|
| طريقة | وقت الإخراج | تعليق |
|---|---|---|
| في الكتابة | 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 |
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT + LIBSTDC ++ + ترجمة ثابتة |
|---|---|---|---|
| طريقة | الحجم الثنائي | تعليق |
|---|---|---|
| fstream | 925 كيلو بايت | استخدام FStream ليس جيدًا لصحتك لأن STD :: locale يتفجر ثنائي. |
| fast_io :: obuf_file | 155 كيلو بايت | |
| fast_io :: c_file_unlocked | 157 كيلو بايت | لقد اخترقت ملف MSVCRT* تطبيق |
| fast_io :: c_file | 157 كيلو بايت | موضوع آمن. لقد اخترقت ملف MSVCRT* تطبيق |
| fast_io :: filebuf_file | 933 كيلو بايت | لقد اخترقت LibStdc ++ 'S std :: filebuf. C ++ دفق تمتص |
توليد 100000000؟ الرموز التعبيرية باستخدام البرنامج في المعايير/0020.UTF/FILL_NC.CC
المعايير في أمثلة/0043.iconv Universal Iconv. (UTF-8 إلى GB18030 كمثال) اختبار ICONV:
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| طريقة | الوقت المنقضي | تعليق |
|---|---|---|
| أمر iconv | 1.529s | |
| Universal.cc | 1.293s | استخدام posix libiconv |
UTF8-> UTF16LE
المعايير في أمثلة/0022.UTF
اختبار ICONV:
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| طريقة | الوقت المنقضي | تعليق |
|---|---|---|
| أمر iconv | 0.967s | GNU ICONV. لا بوم الذي تمتص |
| UTF8_FILE_TO_UTF16_FILE.CC | 0.498s | يمكنني استخدام خوارزميات SSE التي يوفرها مشروع UTF-UTILS. |
UTF8-> UTF32LE
المعايير في أمثلة/0022.UTF
اختبار ICONV:
| منصة | النوافذ | Mingw-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| طريقة | الوقت المنقضي | تعليق |
|---|---|---|
| أمر iconv | 0.844S | GNU ICONV. لا بوم الذي تمتص |
| utf8_file_to_utf32_file.cc | 0.442S | يمكنني استخدام خوارزميات SSE التي يوفرها مشروع UTF-UTILS. |
أصبح إنشاء وتطوير هذا المشروع ممكنًا بفضل المساهمات القيمة لمختلف المشاريع مفتوحة المصدر. على الرغم من أن الكود لم يتم نسخه مباشرة من هذه المشاريع ، إلا أنني استخدمتها كمراجع وأعدت تنفيذها لتناسب الأغراض المحددة لهذه المكتبة. في بعض الحالات ، نشأت مشكلات التكامل التي تتطلب تعديلات على الكود الأصلي. أنا ممتن لهذه المشاريع ومطوريهم على التزامهم بجعل الكود مفتوحًا ومتاحًا للمجتمع الأوسع.
| مشروع | عنوان 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 |
| جنكينز هاش-جافا | 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/ |
| 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 |