C ++: Вы выберете библиотеку boost :: date_time или icu :: date / time? - PullRequest
11 голосов
/ 20 февраля 2012

Мое приложение требует пользовательских настроек времени и даты. Я проверил библиотеки ICU и boost :: date_time. Оба, кажется, отвечают моим требованиям с точки зрения полноты. Я хотел бы знать, есть ли какие-либо предпочтения между ними и на каком основании? какой из них забьет по производительности?

1 Ответ

12 голосов
/ 03 марта 2012

Без дополнительной информации о вашем конкретном случае использования и среде невозможно дать однозначного ответа относительно того, превосходит ли одна из библиотек другую.Как предложил Xeo, профилирование - это лучший способ решения проблем производительности.

Если ваш сценарий использования включает в себя «общие» манипуляции с датой / временем (, а именно , вы еще не знаете полныйспектр операций с датой / временем, которые вам нужны), есть несколько вариантов, которые вы должны сделать.Как объясняет документация Boost.DateTime , у вас есть выбор между этими тремя возможностями:

  1. Точное согласие со временем настенных часов
  2. Точные вычисления между временемinstants
  3. Возможность обрабатывать моменты времени в будущем

Одна из причин, по которой ни одна библиотека не может неявно обрабатывать все три одновременно, заключается в том, что определение того, существует ли переход на летнее время в данный момент временизависит от юрисдикции, ее политических вопросов и множества других факторов.Таким образом, вычисления, которые включают будущие даты, могут стать неточными.

При выборе между этими возможностями вы заметите, что география и локализация играют важную роль.Если, например, ваши требования к дате / времени должны поддерживать только одну локаль, нет веских причин для того, чтобы представить большую библиотеку ICU в качестве зависимости.Но вам, вероятно, также не следует использовать Boost.DateTime: в качестве независимой от локали библиотеки она игнорирует тот факт, что первый день недели зависит от локали.Кроме того, поддержка часового пояса Boost.DateTime нарушена ;В большинстве современных программ для обработки и преобразования часовых поясов используется база данных Olson .Вместо этого вам, вероятно, следует учитывать Boost.Locale при использовании Boost для работы с датами, временем и календарями.,

По умолчанию Boost.Locale использует ICU для всех задач локализации, но предоставляет возможность использовать бэкэнды локализации не на основе ICU.Итак, если вы не используете Boost в другом месте (по какой-либо причине) и вам необходимо поддерживать часовые пояса за пределами текущего часового пояса ОС и часовых поясов, смещенных от UTC (игнорируя переход на летнее время), используйте только ICU.Если вы используете Boost в другом месте, у вас есть выбор между Boost.Locale и ICU, но различия минимальны (в конце концов, ICU включен, так что это действительно вопрос стиля и согласованности).Окончательный выбор возникает, когда вы не используете Boost где-либо еще и имеете дело только с датами в часовом поясе ОС (или с изменениями даты с использованием априори известного смещения от UTC).В этом случае вам, вероятно, следует использовать Boost.Locale.DateTime, но без поддержки ICU.

Сводка

  • Не используйте Boost.DateTime по двум причинам: (1)его поддержка часового пояса сломана;и (2) он игнорирует тот факт, что расчеты «дня недели» зависят от локали.Вместо этого используйте Boost.Locale.DateTime.
  • Если вы используете Boost в другом месте, продолжайте его использовать.Он будет автоматически включать основанные на ICU серверы локализации.В качестве альтернативы вы можете вызывать их напрямую (путем непосредственного включения ICU), но между ними нет существенной разницы.
  • Если вы не используете Boost в другом месте, то ваш выбор зависит от того, является ли вариант использованиялокаль-независимым.Если он не зависит от локали, вы можете использовать не основанные на ICU бэкэнды локализации Boost.Locale.DateTime ( например , std, posix) и избежать накладных расходов ICU.В качестве альтернативы, если ваш вариант использования зависит от локали, вы можете использовать ICU без дополнительных затрат Boost.
  • О производительности: профилирование - единственный способ узнать.
...