注意:您的示例程序在很大程度上是一个微型基准,并且非常有效地最大程度地放大了日期格式化程序的成本。你是在比较什么都不做和做某事。因此,无论那个东西是什么,它看起来都比什么都慢。
这样的测试非常有价值,而且极具误导性。微基准通常仅在您拥有 Teh Slow 的真实案例时才有用。如果你要让这个基准测试速度提高 10 倍(事实上,你可能可以按照我在下面的建议),但现实世界的情况只是你的应用程序中使用的总 CPU 时间的 1%,最终结果不会是显着的速度提高 - 几乎不会引起注意。
产生这种成本的原因是什么?
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMdd HH:mm:ss.SSS"];
最有可能的是,成本与必须解析/验证日期格式字符串以及必须执行任何类型的特定于语言环境的 goop 相关NSDateFormatter
。Cocoa 对本地化有非常彻底的支持,但这种支持是以复杂性为代价的。
看看你是如何编写一个相当棒的示例程序的,你可以在 Instruments 中启动你的应用程序并尝试各种 CPU 采样工具,以了解消耗 CPU 周期的内容以及 Instruments 的工作原理(如果你发现任何有趣的东西,请更新你的问题! )。
是否存在线程必须相互等待的阻塞?
当您使用来自多个线程的单个格式化程序时,我很惊讶它不会简单地崩溃。 NSDateFormatter
没有特别提到它是线程安全的。因此,您必须假设它不是线程安全的。
如何改进使用?
不要创建这么多日期格式化程序!
要么保留一个用于一批操作,然后摆脱它,或者如果您一直使用它们,请在应用程序运行开始时创建一个并保留直到格式更改。
对于线程,如果你真的需要的话,每个线程都保留一个(我敢打赌,这太过分了——你的应用程序的架构使得每批操作创建一个会更明智)。