C++:你会选择boost::date_time还是icu::date/time库?

11

我的应用程序需要自定义的时间和日期设置功能。我查看了ICU和boost::date_time库。从完整性的角度来看,两者都满足我的要求。我想知道它们之间是否有任何偏好,并基于什么?哪个在性能方面更好得分?


3
你的应用程序中已经在使用 boost 库了吗?如果是的话,那么少用一个库会更好。如果没有的话,建议你使用它 ;). - J.N.
是的。我已经在使用boost了。但是我的应用程序对性能敏感。日期/时间函数一直在执行路径中被调用。因此,我想知道在做选择时是否有任何性能方面的考虑。 - notifyroy
4
由于我们没有编写您特定的用例,最好的方法是并排实施并进行分析。请使用“分析器”功能。 - Xeo
增强功能不依赖于ICU吗?您的性能要求是什么? - Steven R. Loomis
1个回答

12
没有更多关于您特定用例和环境的信息,无法确定哪个库优于另一个。正如Xeo所建议的,性能分析是解决性能问题的最佳方法。
如果您的用例包括“常规”日期/时间操作(即,您尚不知道需要的全部日期/时间操作的范围),则必须做出几个选择。正如Boost.DateTime documentation所解释的那样,您可以在以下三种功能之间进行选择:
1. 与挂钟时间完全一致 2. 在时间瞬间之间进行准确计算 3. 能够处理未来的时间瞬间
没有任何库能隐式地同时处理这三个功能的原因之一是,在给定时间瞬间确定夏令时是否存在取决于司法管辖区、其政治问题和众多其他因素。因此,涉及未来日期的计算可能会变得不准确。
在选择这些功能时,您会注意到地理位置和本地化发挥了重要作用。例如,如果您的日期/时间要求只需要支持单个语言环境,则没有理由引入大型ICU库作为依赖项。但是,您可能也不应该使用Boost.DateTime:作为一种无关语言环境的库,它忽略了每周的第一天因语言环境而异的事实。此外,Boost.DateTime的时区支持已经失效;大多数现代软件使用Olson数据库进行时区处理和转换。因此,在使用Boost处理日期、时间和日历时,您应该考虑使用Boost.Locale
默认情况下,Boost.Locale 使用ICU处理所有本地化任务, 但提供了使用非基于ICU的本地化后端的选项。因此,如果您不在其他地方使用Boost(无论出于什么原因)并且需要支持超出当前操作系统时区和从UTC偏移的时区(忽略夏令时),则只使用ICU。如果您在其他地方使用Boost,则可以选择Boost.Locale和ICU之间的差异很小(最终包含ICU,因此这实际上是一个风格和一致性问题)。当您没有在其他地方使用Boost并且仅处理操作系统时区中的日期(或使用 a priori 已知的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的开销。 关于性能:性能分析是唯一的了解方式。

1
谢谢。在经过大约一个小时的仔细搜索后,这是我发现的唯一提供Boost.DateTime和Boost.Locale.DateTime简洁比较的来源。 - Dan Nissenbaum
Boost在MS Windows下真的使用ICU吗?我感到惊讶,因为以前我在Windows下编译Boost时,并不需要做任何有关ICU库的事情。也许最近进行了转变? - Alexis Wilke
@AlexisWilke,当您首次构建Boost库时,有一个选项可以包括对ICU的支持。如果您需要ICU支持,则必须先构建ICU,设置Boost库参数以包括ICU支持,然后构建Boost。 - Caroline Beltran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接