FAST_IO เป็นไลบรารีอินพุต/เอาต์พุต C ++ 20 ที่ให้ความเร็วที่ยอดเยี่ยมและออกแบบมาเพื่อแทนที่ไลบรารี <iostream> ที่ใช้กันทั่วไปและ <cstdio> เป็นห้องสมุดส่วนหัวเท่านั้นและได้รับใบอนุญาตภายใต้ใบอนุญาต MIT ทำให้ง่ายต่อการรวมไว้ในโครงการใด ๆ อย่างไรก็ตามมันต้องใช้คอมไพเลอร์ C ++ 20 ที่รองรับแนวคิด
พื้นที่เก็บข้อมูลดั้งเดิมสำหรับ Fast_io ได้รับการเก็บถาวรเนื่องจาก git bloat เมื่อเวลาผ่านไป แต่ยังสามารถพบการกระทำที่เก่ากว่าได้ที่นั่น การกระทำเก่าอยู่ที่นี่
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 ใน fast_io ไม่จำเป็นต้องบอกเป็นนัยว่าเป็นไลบรารีอินพุต/เอาต์พุตที่ fastest_io ที่สุดที่มีอยู่ คำว่าหมายถึงความจริงที่ว่า fast_io นั้นเร็วกว่า <iostream> และ <cstdio> ไลบรารีในทุกกรณี
ดู Support.md สำหรับรายการสิ่งที่รองรับและบันทึกการใช้งานเฉพาะของแพลตฟอร์ม
คุณสามารถถามคำถามเกี่ยวกับเซิร์ฟเวอร์ Fast_io Discord หรือกลุ่ม 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 สำหรับ FILE* , posix fd และ win32/nt HANDLE
interop ด้วย <cstdio> และ <iostream>
ไม่มีสิ่งที่ใช้ในทางที่ผิดง่าย ๆ เช่น std::endl
ผู้ควบคุม I/O แบบคงที่แทนสตริงรูปแบบ
สถานที่เสริม
การจัดการ I/O ไร้สัญชาติ
การจัดการข้อผิดพลาดที่สอดคล้องกัน เมื่อพร้อมใช้งานข้อยกเว้นเป็นกลไกการรายงานข้อผิดพลาด เพียงอย่างเดียว (ไม่มี std::error_code , std::system_error หรือการตรวจสอบขอบเขตที่ไร้ประโยชน์)
โหมดอิสระ
ที่อยู่รหัสพิเศษ Sanitizer สำหรับการปกป้องปัญหาความปลอดภัยของหน่วยความจำ
การสนับสนุนเครื่องมือวัดแบบไดนามิก
รองรับไอคอน Posix คุณสามารถใช้ FAST_IO สำหรับการแปลงการเข้ารหัสของคุณ
การทำให้เป็นอนุกรมไบนารีสำหรับประเภทที่สามารถคัดลอกได้เล็กน้อยและคอนเทนเนอร์มาตรฐาน
เล่นได้ดีกับคอนเทนเนอร์ C ++ (เช่น std::vector<fast_io::obuf_file> ถูกต้อง)
รูปแบบพื้นฐาน/lua/python/etc (พิมพ์, สแกน) ไม่สนับสนุน C และ C ++ เนื่องจากเป็นอันตรายต่อความปลอดภัย
ให้ APIs เพื่อเปิดเผยการใช้งานภายในของ FILE* และ C ++ สตรีม
อินเทอร์เฟซมือจับแบบดั้งเดิม
รองรับอุปกรณ์ที่กำหนดเองได้ง่ายมาก
C และ C ++ สไตล์คอมไพล์เวลาเปิดการแยกโหมดการแยกวิเคราะห์
ไม่มี traits_type และ EOF
การสนับสนุนประเภทไดนามิก
หลายกระบวนการ
การทำแผนที่หน่วยความจำ
การดีบัก IO (เป็นทางเลือกกับ GUI)
อัลกอริทึมจุดลอยตัวไปกลับ
การสนับสนุนอัลกอริทึมแฮช: Intrinsic SHA-1, Intrinsic HMAC-Sha1, Intrinsic Sha-256, Intrinsic HMAC-Sha256, SHA-512, HMAC-Sha512 เช่นเดียวกับอัลกอริธึมแฮชที่ไม่ใช่ crypto เช่น Jenkins Hash
การบีบอัด zlib/การบีบอัด
ระบบไฟล์
OpenSSL Bio, Qt QFile, MFC CFILE Support
เป้าหมาย: พิมพ์จำนวนเต็มสิบล้านจาก 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 | ฝังอยู่กับ locale, locale "c" |
| c_locale_i/obuf_file ท้องถิ่น | 0.153995S | ฝังอยู่กับ locale, locale "" | |
| 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 => 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 ยังไม่เกี่ยวข้องกับสถานที่ คิดว่ามันแย่แค่ไหน | |
| Rust Itoa Library 0.4.6 | > 0.165s | ฉันเพิกเฉยต่อส่วน n เพื่อให้แน่ใจว่าไม่มีอคติ |
ภาษาสนิมช้ากว่า FAST_IO 10 เท่า + Binary Bloat และ Itoa Library ยังคงช้าและใช้งานได้มากสำหรับฉัน ช้ากว่า Fast_io อย่างน้อย 3 เท่า
เรียกใช้การทดสอบเดียวกันกับ 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 | ฉันแฮ็คการใช้งาน StreamBuf/FileBuf ของ MSVC STL |
รันการทดสอบเดียวกันใน GCC 11. GLIBC+ LIBSTDC ++
| แพลตฟอร์ม | ลินเวกซ์ | 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 | ฝังอยู่กับ locale, locale "c" |
| c_locale_i/obuf_file ท้องถิ่น | 0.162406082S | ฝังอยู่กับ locale, locale "" | |
| 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 ทำให้สิ่งต่าง ๆ ช้าลง | |
| 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 เป็นเวลา 10 เท่าขึ้นอยู่กับแพลตฟอร์มเนื่องจากฉันใช้แนวคิดเพื่อเป็นนามธรรมทั้งหมด FMTLIB ช้าลงจริงประสิทธิภาพ I/O
เราทำการทดสอบนี้สำหรับ MSVC เท่านั้นเนื่องจาก Charconv ของ MSVC เท่านั้นที่ใช้งาน ใช่. Fast_io เอาชนะ Charconv ของ MSVC ได้มากกว่า 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 ++ ของ std :: bufsiz ของ FileBuf เป็น 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 |
| แพลตฟอร์ม | ลินเวกซ์ | 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 | ฉันแฮ็คการใช้งาน STD :: FileBuf ของ MSVC STL |
| แพลตฟอร์ม | หน้าต่าง | MINGW-W64 GCC 11.0.0 | MSVCRT + LIBSTDC ++ + การคอมไพล์แบบคงที่ |
|---|---|---|---|
| วิธี | ขนาดไบนารี | การแสดงความคิดเห็น |
|---|---|---|
| fstream | 925kb | ใช้ fstream ไม่ดีต่อสุขภาพของคุณตั้งแต่ std :: locale bloats ไบนารีของคุณ |
| fast_io :: obuf_file | 155kb | |
| fast_io :: c_file_unlocked | 157KB | ฉันแฮ็คไฟล์ของ MSVCRT* การใช้งาน |
| fast_io :: c_file | 157KB | กระทู้ปลอดภัย ฉันแฮ็คไฟล์ของ MSVCRT* การใช้งาน |
| fast_io :: filebuf_file | 933KB | ฉันแฮ็ค libstdc ++ std :: การใช้งาน filebuf C ++ Stream ดูด |
สร้าง 10,0000000? Emojis โดยใช้โปรแกรมใน Benchmarks/0020.UTF/Fill_nc.cc
เกณฑ์มาตรฐานอยู่ในตัวอย่าง/0043.ICONV ไอคอนสากล (UTF-8 ถึง GB18030 เป็นตัวอย่าง) การทดสอบไอคอน: ICONV:
| แพลตฟอร์ม | หน้าต่าง | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| วิธี | เวลาที่ผ่านไป | การแสดงความคิดเห็น |
|---|---|---|
| คำสั่งไอคอน | 1.529S | |
| universal.cc | 1.293S | ใช้ posix libiconv |
utf8-> utf16le
เกณฑ์มาตรฐานอยู่ในตัวอย่าง/0022.UTF
การทดสอบไอคอน:
| แพลตฟอร์ม | หน้าต่าง | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| วิธี | เวลาที่ผ่านไป | การแสดงความคิดเห็น |
|---|---|---|
| คำสั่งไอคอน | 0.967S | ไอคอน GNU ไม่มีระเบิดที่ดูด |
| utf8_file_to_utf16_file.cc | 0.498s | ฉันใช้อัลกอริทึม SSE ที่จัดทำโดยโครงการ UTF-UTILS |
utf8-> utf32le
เกณฑ์มาตรฐานอยู่ในตัวอย่าง/0022.UTF
การทดสอบไอคอน:
| แพลตฟอร์ม | หน้าต่าง | MINGW-W64 GCC 11.0.0 | MSVCRT+ LIBSTDC ++ |
|---|---|---|---|
| วิธี | เวลาที่ผ่านไป | การแสดงความคิดเห็น |
|---|---|---|
| คำสั่งไอคอน | 0.844S | ไอคอน GNU ไม่มีระเบิดที่ดูด |
| utf8_file_to_utf32_file.cc | 0.442s | ฉันใช้อัลกอริทึม SSE ที่จัดทำโดยโครงการ UTF-UTILS |
การสร้างและพัฒนาโครงการนี้เกิดขึ้นได้ด้วยการมีส่วนร่วมที่มีค่าของโครงการโอเพนซอร์สต่างๆ ในขณะที่รหัสไม่ได้คัดลอกโดยตรงจากโครงการเหล่านี้ แต่ฉันใช้เป็นข้อมูลอ้างอิงและดำเนินการใหม่เพื่อให้เหมาะกับวัตถุประสงค์เฉพาะของห้องสมุดนี้ ในบางกรณีปัญหาการรวมเกิดขึ้นซึ่งจำเป็นต้องมีการแก้ไขรหัสต้นฉบับ ฉันรู้สึกขอบคุณโครงการเหล่านี้และนักพัฒนาของพวกเขาสำหรับความมุ่งมั่นของพวกเขาในการเปิดรหัสของพวกเขาและเข้าถึงได้สำหรับชุมชนที่กว้างขึ้น
| โครงการ | url |
|---|---|
| กริสซุ | 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 |
| crypto ++ | https://github.com/weidai11/cryptopp |
| myitoa | https://gitee.com/xjkp2283572185/mystd |