fast_io
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 удовлетворяет std::ranges::contiguous_range
}
Актуальные примеры можно найти в папке examples/
.
Устаревшие примеры находятся здесь, но они могут больше не работать.
В этом репозитории i18n хранятся исходные файлы 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 для C FILE*
, POSIX fd
и win32/NT HANDLE
.
Взаимодействие с <cstdio>
и <iostream>
.
Нет легко используемых вещей, таких как std::endl
.
Статические манипуляторы ввода-вывода вместо строк формата.
Необязательный языковой стандарт.
Без сохранения состояния манипуляции ввода-вывода.
Последовательная обработка ошибок; когда доступно, исключения как единственный механизм сообщения об ошибках (без std::error_code
, std::system_error
или бесполезной проверки границ).
Автономный режим.
Защита от проблем безопасности памяти с помощью Address Sanitizer.
Динамическая поддержка инструментов.
Поддерживает POSIX iconv. Вы можете использовать fast_io для преобразования кода.
Двоичная сериализация для тривиально копируемых типов и стандартных контейнеров.
Хорошо работает с контейнерами C++ (например, std::vector<fast_io::obuf_file>
допустимо).
Базовый/Lua/Python/и т. д. формат (печать, сканирование). Нет поддержки C и C++, поскольку они представляют угрозу безопасности.
Предоставляет API для раскрытия внутренней реализации FILE*
и потоков C++.
Интерфейс Native Handle.
Чрезвычайно простая поддержка пользовательских устройств.
Анализ режима открытия во время компиляции в стиле C и C++.
Нет traits_type
и EOF
.
Поддержка динамических типов.
Многопроцессорность.
Отображение памяти.
Отладка ввода-вывода (опционально с графическим интерфейсом).
Алгоритм циклического перемещения с плавающей запятой.
Поддержка алгоритмов хеширования: встроенные SHA-1, HMAC-SHA1, SHA-256, HMAC-SHA256, SHA-512, HMAC-SHA512, а также некриптографические алгоритмы хеширования, такие как Jenkins Hash.
Сжатие/распаковка zlib.
Файловая система.
Поддержка OpenSSL BIO, Qt QFile, MFC CFile.
\n
, чтобы избежать предвзятости |Rust медленнее, чем fast_io, в 10 раз. Кроме того, бинарный код и библиотека itoa всё ещё очень медленные и не подходят для меня. Они как минимум в 3 раза медленнее, чем fast_io.
Проведите тот же тест на MSVC 19.26.28805. | 0,633590975 с | | fmt замедляет работу |
| --- | --- | --- |
| fmt::print | 0,495270371 с |
| fmt замедляет работу |
| boost::iostreams | 0,400906063 с | 0,444717051 с | Использование boost iostreams не ускоряет код |
| fast_io::c_file_unlocked | 0,060076723 с | 0,073299716 с | Я взломал реализацию FILE* в glibc |
| fast_io::c_file | 0,092490191 с | 0,104545535 с | Потокобезопасный. Я взломал реализацию FILE* в glibc |
| fast_io::filebuf_file | 0,052251608 с | 0,06655806 с | Я взломал реализацию streambuf/filebuf в libstdc++ |
Можно видеть, что fast_io также может повысить производительность существующих средств в 10 раз! Да, он может даже улучшить производительность FILE* и fstream в 10 раз в зависимости от платформ, поскольку я использую концепции для их абстрагирования. В действительности fmtlib замедляет производительность ввода-вывода.
Мы проводим этот тест только для MSVC, так как только msvc's charconv его реализует. Да. fast_io превосходит charconv от msvc более чем на 20% при выполнении того же алгоритма.
Все тесты находятся в benchmarks/0001.10m_double/charconv.
Запустите тот же тест на MSVC 19.26.28805.
Платформа | Windows | MSVC 19.26.28805 | |
---|---|---|---|
Метод | Время вывода | Комментарий | |
i/obuf_file | 0.4653818 с | ||
charconv + obuf_file | 0.6011 с |
Все тесты находятся в benchmarks/0014.file_io/file_io.
Выведите «Hello World\n» 100 000 000 раз.
Примечание: я изменил BUFSIZ в libstdc++'s std::filebuf на 1 048 576 из-за того, что BUFSIZ слишком мал (512 байта) для MinGW-W64 или работает ужасно.
Платформа | Windows | MinGW-W64 GCC 11.0.0 | MSVCRT + libstdc++ |
---|---|---|---|
Метод | Время вывода | Комментарий | |
fwrite | 2.524001 с | ||
fstream | 1.013001 с | ||
fast_io::obuf_file | 0.437998 с | ||
fast_io::obuf_file_mutex | 1.371 с | потокобезопасный | |
fast_io::c_file_unlocked | 1.164997 с | я взломал реализацию MSVCRT's FILE* | |
fast_io::c_file | 3.337945 с | потокобезопасный. я взломал реализацию MSVCRT's FILE* Реализация. Требуется дополнительная оптимизация. |
Платформа | Linux | GCC 11.0.0 | glibc + libstdc++ |
---|---|---|---|
Метод | Время выполнения | Комментарий |
---|---|---|
fwrite | 1,457288317 с | |
fstream | 1,249783346 с | |
fast_io::obuf_file | 0,494827134 с | |
fast_io::obuf_file_mutex | 0,497138826 с | Поточно-безопасный |
fast_io::c_file_unlocked | 0,687976666 с | Я взломал реализацию FILE* в glibc |
fast_io::c_file | 0,910792697 с | Потокобезопасный. Я взломал реализацию FILE* в glibc |
fast_io::filebuf_file | 0,526955039 с | Я взломал реализацию std::filebuf в libstdc++ |
Платформа | Windows | MSVC 19.26.28805 | UCRT + MSVC STL |
---|---|---|---|
Метод | Время выполнения | Комментарий |
---|---|---|
fwrite | 3,3139122 с | |
fstream | 1,7184119 с | |
fast_io::obuf_file | 0,7996034 с | |
fast_io::obuf_file_mutex | 2,2949221 с | Поточно-безопасный. Похоже, что std::mutex ужасно медленный для MSVC STL. |
fast_io::c_file_unlocked | 1,2103924 с | Я взломал реализацию FILE* в UCRT |
fast_io::c_file | 2,3604295 с | Потокобезопасный. Я взломал реализацию FILE* в UCRT |
fast_io::filebuf_file | 1,2805368 с | Я взломал реализацию std::filebuf в MSVC STL |
| Платформа | Windows | MinGW-W64 GCC 11.0.0 | MSVCRT + libstdc++ + статическая компиляция | |:---------:|:------:|:-------------------:|:------------------------------------------:| | Метод | Размер бинарного файла | Комментарий | |--------------------------------|--------------------------|--------------------------------------------------------| | fstream | 925 КБ | Использование fstream не рекомендуется, так как std::locale увеличивает размер бинарного файла. | | fast_io::obuf_file | 155 КБ | | | fast_io::c_file_unlocked | 157 КБ | Я взломал реализацию FILE* в MSVCRT | | fast_io::c_file | 157 КБ | Потокобезопасный. Я взломал реализацию FILE* в MSVCRT | | fast_io::filebuf_file | 933 КБ | Я взломал реализацию std::filebuf в libstdc++. C++ stream имеет недостатки |
5. Code Convert
Сгенерируйте 100 000 000 эмодзи 🚄 с помощью программы в benchmarks/0020.utf/fill_nc.cc.
Бенчмарки находятся в examples/0043.iconv. Универсальный iconv (например, UTF-8 в GB18030).
Тест iconv:
Платформа | Windows | MinGW-W64 GCC 11.0.0 | MSVCRT + libstdc++ |
---|---|---|---|
Метод | Затраченное время | Комментарий | |
--------------------------------- | --------------------------- | ----------------------- | -------------------------------------------------- |
Команда iconv | 1,529 сек | ||
universal.cc | 1,293 сек | Использует POSIX libiconv |
UTF8->UTF16LE
Бенчмарки находятся в examples/0022.utf.
Тест iconv:
Платформа | Windows | MinGW-W64 GCC 11.0.0 | MSVCRT + libstdc++ |
---|---|---|---|
Метод | Затраченное время | Комментарий | |
--------------------------------- | --------------------------- | ----------------------- | -------------------------------------------------- |
Команда iconv | 0,967 сек | GNU iconv. Нет BOM, что плохо | |
utf8_file_to_utf16_file.cc | 0,498 сек | Я использую алгоритмы SSE, предоставленные проектом utf-utils |
UTF8->UTF32LE
Бенчмарки находятся в examples/0022.utf.
Тест iconv:
Платформа | Windows | MinGW-W64 GCC 11.0.0 | MSVCRT + libstdc++ |
---|---|---|---|
Метод | Затраченное время | Комментарий | |
--------------------------------- | --------------------------- | ----------------------- | -------------------------------------------------- |
Команда iconv | 0,844 сек | GNU iconv. Нет BOM, что плохо |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )