Есть ли улов с FastFormat?
Я только что прочитал о библиотеке форматирования ввода-вывода FastFormat C++, и это кажется слишком хорошим, чтобы быть правдой: даже быстрее, чем printf, типизированный и с тем, что я считаю приятным интерфейсом:
// prints: "This formats the remaining arguments based on their order - in this case we put 1 before zero, followed by 1 again"
fastformat::fmt(std::cout, "This formats the remaining arguments based on their order - in this case we put {1} before {0}, followed by {1} again", "zero", 1);
// prints: "This writes each argument in the order, so first zero followed by 1"
fastformat::write(std::cout, "This writes each argument in the order, so first ", "zero", " followed by ", 1);
Это выглядит слишком хорошо, чтобы быть правдой. Есть ли подвох? Были ли у вас хорошие, плохие или безразличные переживания?
6 ответов
Есть ли улов с FastFormat?
В прошлый раз, когда я проверял, был один раздражающий улов:
Вы можете использовать только версию с узкой строкой или версию с широкой строкой этой библиотеки. (Функции для wchar_t
а также char
одинаковы - какой тип используется, это переключатель времени компиляции.)
С iostreams, stdio или Boost.Format вы можете использовать оба.
Найден один "улов", хотя для большинства людей он никогда не проявится. Со страницы проекта:
Атомная операция. Он не выписывает элементы оператора по одному, как IOStreams, поэтому не имеет проблем с атомарностью
Единственный способ увидеть, что это происходит, - это write()
сам вызов, а затем записывает его в ostream
в один шаг. Это означает, что он должен выделить память, и если объект передан в write()
Вызов call производит много выходных данных (несколько мегабайт или более), он может потреблять вдвое больше памяти во внутренних буферах (при условии, что он использует трюк "увеличение буфера путем удвоения его размера каждый раз").
Если вы просто используете его для ведения журнала, а не, скажем, для сброса огромных объемов XML, вы никогда не увидите эту проблему.
Единственный другой "улов", который я вижу:
Очень портативный. Он будет работать со всеми хорошими современными компиляторами C++; это даже работает с Visual C++ 6!
Так что он не будет работать со старым компилятором C++, как cfront
, в то время как iostreams
обратно совместим с концом 80-х годов. Опять же, я был бы удивлен, если бы у кого-нибудь когда-нибудь были проблемы с этим.
Хотя FastFormat - хорошая библиотека, с ней есть ряд проблем:
- Ограниченная поддержка форматирования, в частности, следующие функции не поддерживаются:
- Лидирующие нули (или любые другие пробелы)
- Восьмеричное / шестнадцатеричное кодирование
- Ширина выполнения / спецификация выравнивания
- Библиотека довольно большая для относительно небольшой задачи форматирования и имеет еще большую зависимость (STLSoft).
Это выглядит довольно интересно на самом деле! Хороший совет, и +1 за это!
Я играл с этим немного. Основной недостаток, который я вижу, заключается в том, что FastFormat поддерживает меньше параметров форматирования для вывода. Это, я думаю, прямое следствие того, как достигается более высокая безопасность типов, и хороший компромисс в зависимости от ваших обстоятельств.
Если вы посмотрите подробно на его страницу производительности, вы заметите, что старый добрый C printf
-семейные функции все еще выигрывают в Linux. На самом деле, единственный тестовый случай, когда они работают плохо, это тестовый случай, который должен быть конкатенацией статических строк, где я ожидал printf
быть расточительным. Кроме того, GCC обеспечивает статическую проверку типов на printf
-стиль вызовов функций, поэтому польза от безопасности типов снижается. Итак: если вы работаете в Linux и вам нужна абсолютная лучшая производительность, FastFormat, вероятно, не является оптимальным решением.
Библиотека зависит от пары переменных среды, как указано в документации.
Это может быть не так уж важно для некоторых людей, но я бы предпочел, чтобы мой код был максимально автономным. Если я проверю это из системы контроля версий, она должна работать и компилироваться. Не будет, если для этого потребуется установить переменные окружения.