多线程 – 如何最小化分配和初始化NSDateFormatter的成本?

我注意到使用NSDateFormatter可能相当昂贵.我发现分配和初始化对象已经消耗了很多时间.
此外,似乎在多线程中使用NSDateFormatter会增加成本.线程可以相互等待吗?

我创建了一个小的测试应用程序来说明问题.请检查一下.

> http://github.com/johnjohndoe/TestNSDateFormatter
> git://github.com/johnjohndoe/TestNSDateFormatter.git

这些费用的原因是什么,如何改善使用?

17,12. – 更新我的观察:我不明白为什么与串行顺序运行时相比,线程运行时间更长.时差仅在使用NSDateFormatter时发生.

解决方法

注意:您的示例程序非常微小,并且非常有效地最大限度地放大了日期格式化程序的成本.你正在比较做任何事情绝对没有做任何事情.因此,无论什么事情,它似乎都比没有任何事情慢一些.

这些测试是非常有价值的,非常误导.微型基准测试通常只有在您有真实世界的Teh Slow的情况下才有用.如果你把这个基准值提高10倍(实际上你可能可以用下面的建议),但是现实世界的情况只是你应用程序使用的总cpu间的1%,最终的结果是不会戏剧性的速度提高 – 几乎不显眼.

What is the reason for such costs?

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMdd HH:mm:ss.SSS"];

很可能,成本与解析/验证日期格式字符串并且必须执行NSDateFormatter执行的任何类型的区域设置特定的goop相关联. Cocoa对本地化具有非常彻底的支持,但是这种支持的成本是复杂的.

看到如何写一个相当棒的示例程序,您可以在仪器中启动应用程序,并尝试各种cpu采样仪器,以了解什么是消耗cpu周期以及仪器的工作原理(如果您发现有趣的话,请更新您的问题! ).

Can there be a blocking where the threads have to wait for each other?

我很惊讶,当您使用多个线程的单个格式化程序时,它不会简单崩溃. NSDateFormatter没有特别提到它是线程安全的.因此,您必须假定它不是线程安全的.

How can I improve the usage?

不要创建这么多日期格式化程序!

或者保留一批操作,然后将其删除,或者如果您始终使用em,请在应用程序的运行开始时创建一个操作,并保持格式更改.

对于线程,每个线程都要保持一个线程,如果你真的需要(我敢打赌这是过分的 – 你的应用程序的架构是这样的,每批操作创建一个更明智的).

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量