Есть ли уловка с FastFormat?

Я просто прочитал о библиотеке форматирования FastFormat С++ i/o, и кажется слишком хорошим, чтобы быть правдой: быстрее, чем printf, typeafe, и с тем, что я считаю приятным интерфейсом:

// 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);

Это выглядит слишком хорошо, чтобы быть правдой. Есть ли улов? Были ли у вас хорошие, плохие или безразличные переживания?

Ответы

Ответ 1

Есть ли уловка с FastFormat?

В прошлый раз, когда я проверил, был один раздражающий улов:

Вы можете использовать только узкую строчную версию или широкоформатную версию этой библиотеки. (Функции для wchar_t и char совпадают - этот тип используется, это таймер компиляции.)

С iostreams, stdio или Boost.Format вы можете использовать оба.

Ответ 2

Нашел один "улов", хотя для большинства людей он никогда не проявится. На странице проекта:

Атомная операция. Он не выписывает элементы инструкции по одному, как IOStreams, поэтому проблем с атомарностью не возникает

Единственный способ, которым я могу это видеть, - это то, что он буферизует весь вывод вызова write() сам, а затем записывает его в ostream за один шаг. Это означает, что ему необходимо выделить память, и если объект, переданный в вызов write(), выдает много выходных данных (несколько мегабайт или более), он может потреблять вдвое большую память во внутренних буферах (при условии, a-buffer-by-doubling-its-size-each-time trick).

Если вы просто используете его для ведения журнала, а не, скажем, сбрасываете огромное количество XML, вы никогда не увидите эту проблему.

Единственный другой "улов", который я вижу, это:

Очень портативный. Он будет работать со всеми хорошими современными компиляторами на С++; он даже работает с Visual С++ 6!

Поэтому он не будет работать со старым компилятором С++, например cfront, тогда как iostreams обратно совместим с конце 80-х. Опять же, я был бы удивлен, если бы у кого-нибудь была проблема с этим.

Ответ 3

Хотя FastFormat - хорошая библиотека, есть ряд проблем с ним:

  • Ограниченная поддержка форматирования, в частности, не поддерживаются следующие функции:
    • Ведущие нули (или любые другие пробелы без пробелов)
    • Октальное/шестнадцатеричное кодирование
    • Спецификация ширины/выравнивания времени выполнения
  • Библиотека довольно велика для относительно небольшой задачи форматирования и имеет еще большую зависимость (STLSoft).

Ответ 4

Это выглядит довольно интересно! Хороший совет, и +1 для этого!

Я играл с ним немного. Главный недостаток, который я вижу, заключается в том, что FastFormat поддерживает меньше параметров форматирования для вывода. Это, я думаю, прямое следствие того, как достигается более высокая степень безопасности, и хороший компромисс в зависимости от ваших обстоятельств.

Ответ 5

Если вы посмотрите подробно на своей тестовой странице производительности, вы заметите, что старые добрые функции C printf -family все еще выигрывают в Linux. Фактически, единственным тестовым случаем, когда они работают плохо, является тестовый пример, который должен быть статическим конкатенации строк, где я ожидал бы, что printf будет расточительным. Кроме того, GCC обеспечивает статическую проверку типов при вызовах функций printf -style, поэтому преимущества безопасности типов снижаются. Итак: если вы работаете в Linux, и если вам нужна абсолютная лучшая производительность, FastFormat, вероятно, не является оптимальным решением.

Ответ 6

Библиотека зависит от нескольких переменных окружения, как указано в docs.

Для некоторых людей это может быть не biggie, но я бы предпочел, чтобы мой код был как можно более автономным. Если я проверю его из источника управления, он должен работать и компилироваться. Это не будет, если для этого требуется установить переменные среды.