Мое приложение требует специальных возможностей настройки времени и даты. Я проверил библиотеки ICU и boost:: date_time. Оба, как представляется, соответствуют моим требованиям с точки зрения полноты. Я хотел бы знать, есть ли предпочтение между этими двумя и на каком основании? который забьет на производительность?
С++: Будете ли вы выбирать boost:: date_time или icu:: date/time library?
Ответ 1
Без дополнительной информации о вашем конкретном случае использования и окружающей среде нет никакого способа дать окончательный ответ о том, выполняет ли другая библиотека другой. Как предположил Xeo, профилирование является наилучшим способом решения проблем производительности.
Если ваш вариант использования включает "общую" обработку даты и времени (а именно, вы еще не знаете полный спектр операций даты и времени, которые вам нужны), вам нужно сделать несколько вариантов. Как поясняет документация Boost.DateTime, у вас есть выбор между этими тремя возможностями:
- Точное согласование с временем настенных часов
- Точные расчеты между моделями времени
- Способность обрабатывать моменты времени в будущем
Одна из причин, почему ни одна библиотека не может неявно обрабатывать все три одновременно, заключается в том, что определение того, существует ли время летнего времени в определенный момент времени, зависит от юрисдикции, ее политических проблем и множества других факторов. Таким образом, расчеты, которые предполагают будущие даты, могут стать неточными.
При решении этих возможностей вы заметите, что география и локализация играют важную роль. Если, например, ваши требования к дате/времени должны поддерживать только одну локаль, не существует обоснованной причины, чтобы представить большую библиотеку ICU в качестве зависимости. Но вы, вероятно, не должны использовать Boost.DateTime, либо: как локально-агностическая библиотека, он игнорирует тот факт, что первый день недели зависит от локали. Кроме того, поддержка часового пояса Boost.DateTime сломана; самое современное программное обеспечение использует базу данных Olson для обработки и преобразования часовых поясов. Вместо этого вам следует, вероятно, рассмотреть Boost.Locale при использовании Boost для работы с датами, временем и календарем.
По умолчанию Boost.Locale использует ICU для всех задач локализации, но предоставляет возможность использования сторонних локализаций на основе ICU, Итак, если вы не используете Boost в другом месте (по какой-либо причине) и должны поддерживать часовые пояса за пределами текущего часового пояса ОС и временных зон, сдвинутых с UTC (без учета летнего времени), используйте только ICU. Если вы используете Boost в другом месте, у вас есть выбор между Boost.Locale и ICU, но различия минимальны (в конце, ICU включен, так что это действительно стилистический и согласованный вопрос). Окончательный выбор возникает, когда вы не используете Boost в другом месте, и имеете дело только с датами в часовом поясе OS (или модификациями даты с использованием априорно известного смещения от UTC). В этом случае вам, вероятно, следует использовать Boost.Locale.DateTime, но без поддержки ICU.
Резюме
- Не используйте Boost.DateTime по двум причинам: (1) не поддерживается его поддержка часового пояса; и (2) он игнорирует тот факт, что расчеты "день недели" зависят от локали. Вместо этого используйте Boost.Locale.DateTime.
- Если вы используете Boost в другом месте, продолжайте использовать его. Он автоматически включит поддержку локализации на основе ICU. Вы можете также ссылаться на них напрямую (напрямую, включая ICU), но нет существенной разницы.
- Если вы используете не, используя Boost в другом месте, тогда ваш выбор зависит от того, является ли вариант использования локально независимым. Если он не зависит от локали, вы можете использовать Boost.Locale.DateTime, не основанные на ICU, серверы локализации (например, std, posix) и избежать накладных расходов ICU. В качестве альтернативы, если ваш вариант использования зависит от локали, вы можете использовать ICU, не внося накладные расходы Boost.
- По производительности: профилирование - единственный способ узнать.