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 Repo хранит исходные файлы i18N.
https://bitbucket.org/ejsvifq_mabmip/fast_io_i18n
Термин fast в 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 (NO LIBC правильно с ним не имеет дело)
Raii для c FILE* , posix fd и win32/ HANDLE
Взаимодействовать с <cstdio> и <iostream>
Не легко злоупотребляют такими вещами, как std::endl
Статические манипуляторы ввода/вывода вместо строк формата.
Необязательный локаль.
Манипуляция в/выводах без гражданства.
Постоянная обработка ошибок; При наличии исключения как единственный механизм отчетности об ошибках (без std::error_code , std::system_error или бесполезная проверка границ)
Отдельный режим.
Обратите внимание на специальный код дезинфицирующего средства для защиты вопросов безопасности памяти.
Динамическая поддержка инструментов
Поддерживает POSIX ICONV. Вы можете использовать fast_io для преобразования кодирования.
Бинарная сериализация для тривиально копируемых типов и стандартных контейнеров
Хорошо играет с контейнерами C ++ (например std::vector<fast_io::obuf_file> действителен)
Basic/Lua/Python/Etc Format (Print, Scan). Нет поддержки C и C ++, поскольку они представляют собой опасности безопасности.
Предоставьте API, чтобы выявить внутреннюю реализацию потоков FILE* и C ++.
Нативный интерфейс ручки
Чрезвычайно прост в поддержке пользовательских устройств
C и C ++ Стиль Время Компиляции Время открытия режима режима.
Нет traits_type и EOF
Поддержка динамического типа
Multi Process
Картирование памяти
Отладка ввода -вывода (при желании с графическим интерфейсом)
Алгоритм плавающей запятой в оба
Поддержка алгоритмов хэш: внутренний SHA-1, Intrinsic HMAC-SHA1, внутренний SHA-256, внутренний HMAC-SHA256, SHA-512, HMAC-SHA512, а также не криптовые алгоритмы, такие как Jenkins Hash.
zlib сжатие/декомпрессия
Файловая система
OpenSSL Bio, QT Qfile, MFC Cfile Support
Цель: распечатайте десять миллионов целых чисел от 0 до 10 млн. Затем снова откройте этот файл, чтобы отсканировать.
Все тесты находятся в тестах/0000.10M_SIZE_T/UNIT.
Примечание: я модифицировал Bufsiz 1048576 Libstdc ++ из-за Bufsiz слишком мал (512 байт) для Mingw-W64, или он работает ужасно.
| Платформа | Окна | Mingw-W64 GCC 11.0.0 | MSVCRT+ libstdc ++ |
|---|---|---|---|
| Метод | Время вывода | Время ввода | Комментарий |
|---|---|---|---|
| stdio.h (fprintf/fscanf) | 2.412987S | 5.607791S | |
| FSTREAM | 0,462012 с | 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" |
| c_locale_i/obuf_file local | 0,153995 | пропитан локали, локаль "" | |
| fmt :: format_int+obuf_file | 0,122999S | ||
| fmt :: format_int+ofstream | 0,209055S | ||
| fmt :: format+oftream | 0,548 с | FMT делает вещи медленнее | |
| fmt :: print | 0,663996 с | FMT делает вещи медленнее | |
| std :: to_chars+obuf_file | 0,12 с | ||
| std :: to_chars+oftream | 0,192 с | ||
| FAST_IO :: C_FILE_UNLOCKED | 0,098999S | 0,126003S | Я взломал реализацию файла MSVCRT* |
| FAST_IO :: C_FILE | 0,298988S | 0,318001S | Поток сейф. Я взломал реализацию файла MSVCRT* |
| fast_io :: filebuf_file | 0,048999 с | 0,081 с | Я взломал реализацию Libstdc ++ Streambuf/filebuf |
| fast_io :: iobuf_utf8_file_char16 | 0,124 с | 0,112001S | UTF-16 => UTF-8 с SSE |
| fast_io :: iobuf_utf8_file_char32 | 0,110999 с | 0,111011 с | UTF-32 => UTF-8 с SSE |
| std :: wofstream | 2,64 с | 3.843735S | wofstream с std :: locale codecvt. Чрезвычайно медленный TBH. |
| FAST_IO :: WFILEBUF_IO_OBSERVER | 2.415692S | 2.497704S | wofstream с std :: locale codecvt. Это доказывает, что Fstream никогда не может быть исправлено. |
| Rust Language | 0,483 с | Ржавчина медленно. Также ржавчина не имеет дело с локали. Подумайте, как это плохо. | |
| Библиотека rust itoa 0.4.6 | > 0,165 с | Я проигнорировал часть n , чтобы не убедиться в предвзятости. |
Язык ржавчины в 10 раз медленнее, чем fast_io. + Бинарное раздувание и библиотека ITOA все еще очень медленное и полезное для меня. Это как минимум в 3 раза медленнее, чем fast_io.
Запустите тот же тест на MSVC 19.26.28805.
| Платформа | Окна | MSVC 19.26.28805 | Установите время от времени моей жизни |
|---|---|---|---|
| Метод | Время вывода | Время ввода | Комментарий |
|---|---|---|---|
| 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+oftream | 0,5461922S | ||
| FAST_IO :: C_FILE_UNLOCKED | 0,1102575S | 0,2399757S | Я взломал реализацию Universal CRT File* |
| 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 | |
| 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" |
| 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+oftream | 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 фактически замедляет производительность ввода/вывода.
Мы выполняем этот тест только для MSVC, так как только MSVC Charconv реализует его. Да. 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,6011 с |
Все тесты находятся в тестах/0014.file_io/file_io.
Вывод 100000000x "Привет, мир n"
Примечание: я модифицировал Libstdc ++ S std :: filebuf's bufsiz на 1048576 из-за Bufsiz слишком мал (512 байтов) для Mingw-W64 или он работает ужасно.
| Платформа | Окна | Mingw-W64 GCC 11.0.0 | MSVCRT+ libstdc ++ |
|---|---|---|---|
| Метод | Время вывода | Комментарий |
|---|---|---|
| fwrite | 2.524001S | |
| FSTREAM | 1.013001S | |
| fast_io :: obuf_file | 0,437998 с | |
| 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,467001 с | Я взломал реализацию libstdc ++ 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 ++ std :: filebuf |
| Платформа | Окна | 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 |
| Платформа | Окна | 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 | 933KB | Я взломал реализацию std :: filebuf. C ++ Stream отстой |
Генерировать 10000000000? Emojis с использованием программы в тестах/0020.utf/fill_nc.cc
Тесты находятся в примерах/0043.iconv Universal Iconv. (UTF-8 до GB18030 в качестве примера) тест ICONV:
| Платформа | Окна | Mingw-W64 GCC 11.0.0 | MSVCRT+ libstdc ++ |
|---|---|---|---|
| Метод | Прошло время | Комментарий |
|---|---|---|
| Команда ICONV | 1,529 с | |
| Universal.cc | 1.293S | Используйте Posix libiconv |
UTF8-> UTF16LE
Тесты в примерах/0022.utf
ICONV Тест:
| Платформа | Окна | Mingw-W64 GCC 11.0.0 | MSVCRT+ libstdc ++ |
|---|---|---|---|
| Метод | Прошло время | Комментарий |
|---|---|---|
| Команда ICONV | 0,967 с | GNU ICONV. Нет бом, который отстой |
| UTF8_FILE_TO_UTF16_FILE.CC | 0,498 с | Я использую алгоритмы SSE, предоставленные проектом UTF-UTILS. |
UTF8-> UTF32LE
Тесты в примерах/0022.utf
ICONV Тест:
| Платформа | Окна | Mingw-W64 GCC 11.0.0 | MSVCRT+ libstdc ++ |
|---|---|---|---|
| Метод | Прошло время | Комментарий |
|---|---|---|
| Команда ICONV | 0,844 с | GNU ICONV. Нет бом, который отстой |
| UTF8_FILE_TO_UTF32_FILE.CC | 0,442 с | Я использую алгоритмы SSE, предоставленные проектом UTF-UTILS. |
Создание и разработка этого проекта стали возможными благодаря ценным вкладам различных проектов с открытым исходным кодом. В то время как код не был скопирован непосредственно из этих проектов, я использовал их в качестве ссылок и переосмыслил их в соответствии с конкретными целями этой библиотеки. В некоторых случаях возникли проблемы с интеграцией, которые требовали модификации исходного кода. Я благодарен этим проектам и их разработчикам за то, что они привержены открытым и доступным для более широкого сообщества.
| Проект | URL |
|---|---|
| Grisu-Exact | https://github.com/jk-jeon/grisu-exact |
| Рю | https://github.com/ulfjack/ryu |
| Ша-Интризия | 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/ |
| Дракона | https://github.com/jk-jeon/dragonbox |
| Jeaiii | https://github.com/jeaiii/itoa |
| Crypto ++ | https://github.com/weidai11/cryptopp |
| Митоа | https://gitee.com/xjkp2283572185/mystd |