2016-07-25 9 views
3

2013-12-19 00:00:00.000000形式の日付を中間形式の日付(Dec 25, 2014)に変換し、倍精度(エポック)に変換する際に、iOSアプリケーションでパフォーマンスの問題が発生しています。 Xcodeプロファイラによれば、このプロセスを実行する2つの関数(実行中)は、実行時間の約60%を占めています。日付の解析中にパフォーマンスの問題が発生する

このコードを改善する方法を知りたいのですが、必要。

static func getMediumDate(dateString: String) -> (NSString)? { 

    // Get the: yyyy-MM-dd 
    let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)] 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    dateFormatter.dateFormat = "yyyy-MM-dd" 

    let stringFormatter = NSDateFormatter() 
    stringFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    stringFormatter.dateFormat = "yyyy-MM-dd" 
    stringFormatter.dateStyle = .MediumStyle 

    let newDate = dateFormatter.dateFromString(shorDate) 

    if (newDate != nil){ 
     return stringFormatter.stringFromDate(newDate!) 
    }else{ 
     return nil 
    } 
} 

static func getSortDate(dateString:String) -> Double{ 

    // Get the: yyyy-MM-dd 
    let shorDate = dateString[dateString.startIndex..<dateString.startIndex.advancedBy(10)] 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
    dateFormatter.dateFormat = "yyyy-MM-dd" 

    let newDate = dateFormatter.dateFromString(shorDate) 

    let value = newDate?.timeIntervalSince1970 

    if value < DBL_MIN{ 
     return 0 
    }else if value > DBL_MAX{ 
     return DBL_MAX 
    }else if value != nil{ 
     return value! 
    }else{ 
     return 0 
    } 
} 
+0

日付フォーマッタの作成と 'dateFormat'プロパティの設定は、高価な操作です。各日付フォーマッタを一度作成し、静的プロパティに格納して再利用します。 – dan

答えて

6

NSDateFormatterが悪いです。毎回新しいインスタンスを作成するのではなく、一度作成してキャッシュし、同じインスタンスを再利用する必要があります。例えば

、次の操作を実行できます。

extension NSDateFormatter { 
    private static let standardDateFormatter: NSDateFormatter = { 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.locale = NSLocale(localeIdentifier: "en_US") 
     dateFormatter.dateFormat = "yyyy-MM-dd" 
     return dateFormatter 
    }() 
} 
+1

iOS 7以降では、 'NSDateFormatter'はスレッドセーフです。 - https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/index.html#//apple_ref/occ/cl/NSDateFormatterの「スレッドセーフティ」の章 –

+0

ニースキャッチ、ありがとう@EvgenyKarkan – dannyzlo

+0

どうやって使用しますか?ゲッターのようなもの?あなたは私に例を与えることができますか? – ur3k

4

NSDateFormatterインスタンスの作成 - 複雑なCPUのかかる作業です。
一度使用するか、共有インスタンスを作成する方がよいです。

のベストNSDateFormatterプラクティスを記述し、このスレッドを見てみましょう - Whats the best practice for NSDateFormatter in Swift?

また、あなたは、AppleからData Formatting Guideに見つけることができます。この詳細は:効率

作成するための

キャッシュフォーマッタを日付フォーマッタは安価な操作ではありません。フォーマッタを頻繁に使用する可能性がある場合は、複数のインスタンスを作成して破棄するよりも、単一のインスタンスをキャッシュするほうが効率的です。 1つのアプローチは静的変数を使用することです。だから、

、あなたのコードをリファクタリングする - あなたはINITSとのみ1が返されるインスタンスを使用して、(1つのメモリアドレス)インスタンスを共有返す関数で3つのNSDataFormatterインスタンスの初期化を交換する必要があります。

+0

あなたの答えはありがとう、それは正しい答えですが、Danny Zlobinskyが最初に答えました。それにもかかわらず、私は答えに投票します。 – ur3k

関連する問題