效能優化之 NSDateFormatter

發表於2016-12-17

為什麼要優化NSDateFormatter?

首先,過度的建立NSDateFormatter用於NSDateNSString之間轉換,會導致App卡頓,開啟Profile工具查一下效能,你會發現這種操作佔CPU比例是非常高的。據官方說法,建立NSDateFormatter代價是比較高的,如果你使用的非常頻繁,那麼建議你快取起來,快取NSDateFormatter一定能提高效率。

Creating a date formatter is not a cheap operation. If you are likely to use a formatter frequently, it is typically more efficient to cache a single instance than to create and dispose of multiple instances. One approach is to use a static variable

優化方式有哪些?

a.延遲轉換

即只有在UI需要使用轉換結果時在進行轉換。

b.Cache in Memory

根據NSDateFormatter執行緒安全性,不同的iOS系統版本記憶體快取如下:

  • prior to iOS 7

如果直接採用靜態變數進行儲存,那麼可能就會存線上程安全問題,在iOS 7之前,NSDateFormatter是非執行緒安全的,因此可能就會有兩條或以上的執行緒同時訪問同一個日期格式化物件,從而導致App崩潰。

  • iOS 7 or later

在iOS 7、macOS 10.9及以上系統版本,NSDateFormatter都是執行緒安全的,因此我們無需擔心日期格式化物件在使用過程中被另外一條執行緒給修改,為了提高效能,我們還可以在上述程式碼塊中進行簡化(除去冗餘部分)。

如果快取了日期格式化或者是其他依賴於current locale的物件,那麼我們應該監聽NSCurrentLocaleDidChangeNotification通知,當current locale變化時及時更新被快取的日期格式化物件。

In theory you could use an auto-updating locale (autoupdatingCurrentLocale) to create a locale that automatically accounts for changes in the user’s locale settings. In practice this currently does not work with date formatters.

Apple Threading Programming Guide

c.利用標準C語言庫

如果時間日期格式是固定的,我們可以採用C語言中的strptime函式,這樣更加簡單高效。

相關資料:

Date Formate Patterns :

111639372-1accc35e3ae104bd

date-formate-patterns.png

Standard C library

ISO_8601

相關文章