1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/qabeowjbtkwb-fast_io

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
readme.md

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

F.A.Q.

Что означает «fast» в fast_io?

Термин «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.

После C++20

  1. Поддержка модулей.
  2. Поддержка сопрограмм для асинхронного ввода-вывода.
  3. Улучшение и рефакторинг кода после добавления в стандарт Zero-overhead deterministic exceptions. | Метод | Время вывода | Время ввода | Комментарий | |--------------------------------|---------------------------|--------------------------|------------------------------------------------------| | stdio.h (fprintf/fscanf) | 2,412987 с | 5,607791 с | | | fstream | 0,462012 с | 1,192 с | | | fstream с rdbuf.sputc трюком | 0,33895 с | 1,170173 с | | | fast_io::i/obuf_file | 0,04903 с | 0,080996 с | | | fast_io::i/obuf_file_mutex | 0,146064 с | 0,113155 с | Поточно-безопасный | | c_locale_i/obuf_file («C») | 0,065988 с | 0,086012 с | Снабжён локалью, локаль «C» | | c_locale_i/obuf_file local | 0,153995 с | :x: | Снабжён локалью, локаль пустая строка | | fmt::format_int+obuf_file | 0,122999 с | :x: | | | fmt::format_int+ofstream | 0,209055 с | :x: | | | fmt::format+ofstream | 0,548 с | :x: | fmt замедляет работу | | fmt::print | 0,663996 с | :x: | fmt замедляет работу | | std::to_chars+obuf_file | 0,12 с | :x: | | | std::to_chars+ofstream | 0,192 с | :x: | | | fast_io::c_file_unlocked | 0,098999 с | 0,126003 с | Я взломал реализацию FILE* в MSVCRT | | fast_io::c_file | 0,298988 с | 0,318001 с | Потокобезопасный. Я взломал реализацию FILE* в MSVCRT | | fast_io::filebuf_file | 0,048999 с | 0,081 с | Я взломал реализацию streambuf/filebuf в libstdc++ | | fast_io::iobuf_utf8_file_char16 | 0,124 с | 0,112001 с | UTF-16 => UTF-8 с SSE | | fast_io::iobuf_utf8_file_char32 | 0,110999 с | 0,111011 с | UTF-32 => UTF-8 с SSE | | wofstream | 2,64 с | 3,843735 с | wofstream с кодом std::locale codecvt. Чрезвычайно медленный | | fast_io::wfilebuf_io_observer | 2,415692 с | 2,497704 с | wofstream с кодом std::locale codecvt. Это доказывает, что fstream никогда не будет исправлен | | Язык Rust | 0,483 с :x: | RUST МЕДЛЕННЫЙ. Также Rust не работает с локалями. Представьте, насколько это плохо | | Библиотека itoa 0.4.6 | > 0,165 с :x: | Я проигнорировал часть \n, чтобы избежать предвзятости |

Rust медленнее, чем fast_io, в 10 раз. Кроме того, бинарный код и библиотека itoa всё ещё очень медленные и не подходят для меня. Они как минимум в 3 раза медленнее, чем fast_io.

Проведите тот же тест на MSVC 19.26.28805. | 0,633590975 с | :x: | fmt замедляет работу | | --- | --- | --- | | fmt::print | 0,495270371 с | :x: | 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 замедляет производительность ввода-вывода.

  1. Выведите 10 миллионов значений типа double в режиме round-trip с использованием алгоритма Ryu.

Мы проводим этот тест только для 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 с
  1. Производительность необработанного ввода-вывода

Все тесты находятся в 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
  1. Размер бинарного файла Просто используйте бенчмарк в benchmarks/0014.file_io/file_io. Чувак, тебе следует избегать потоков как чумы, если честно. Это нездорово.

| Платформа | 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/qabeowjbtkwb-fast_io.git
git@api.gitlife.ru:oschina-mirror/qabeowjbtkwb-fast_io.git
oschina-mirror
qabeowjbtkwb-fast_io
qabeowjbtkwb-fast_io
master