我的应用程序需要自定义的时间和日期设置功能。我查看了ICU和boost::date_time库。从完整性的角度来看,两者都满足我的要求。我想知道它们之间是否有任何偏好,并基于什么?哪个在性能方面更好得分?
没有更多关于您特定用例和环境的信息,无法确定哪个库优于另一个。正如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的开销。 关于性能:性能分析是唯一的了解方式。