Примечание : Ваша примерная программа является очень микро-эталоном и очень эффективно максимально увеличивает стоимость форматера даты. Вы сравниваете абсолютно ничего не делая с что-то делаете . Таким образом, независимо от того, что это что-то , оно будет казаться чем-то раз медленнее ничто .
Такие тесты чрезвычайно ценны и вводят в заблуждение. Микро-тесты обычно полезны только тогда, когда у вас есть реальный пример Teh Slow. Если бы вам пришлось сделать этот тест в 10 раз быстрее (что, на самом деле, вы могли бы сделать с тем, что я предлагаю ниже), но реальный случай составляет всего 1% от общего процессорного времени, используемого в вашем приложении, конечный результат не будет резкое улучшение скорости - это будет едва заметно.
В чем причина таких расходов?
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMdd HH:mm:ss.SSS"];
Скорее всего, стоимость связана как с необходимостью анализа / проверки строки формата даты, так и с выполнением любого вида локали, специфичного для языка, который делает NSDateFormatter
. Какао имеет чрезвычайно тщательную поддержку локализации, но эта поддержка обходится за счет сложности.
Видя, как вы написали довольно классный пример программы, вы можете запустить свое приложение в Instruments и попробовать различные инструменты выборки CPU, чтобы понять, как потребляются циклы CPU и как работают Instruments (если вы найдете что-нибудь интересное, пожалуйста обновите свой вопрос!).
Может ли быть блокировка, когда потоки должны ждать друг друга?
Я удивлен, что это не просто сбой, когда вы используете один форматер из нескольких потоков. NSDateFormatter
специально не упоминает, что это потокобезопасный. Таким образом, вы должны предположить, что это не потокобезопасно.
Как я могу улучшить использование?
Не создавайте так много форматеров даты!
Либо оставьте один для пакета операций, а затем избавьтесь от него или, если вы используете их все время, создайте его в начале работы вашего приложения и держите его до изменения формата.
Для многопоточности сохраняйте по одному на каждый поток, если вам действительно это нужно (держу пари, что это чрезмерно - архитектура вашего приложения такова, что создание одной операции на пакет будет более разумным).