iOS/Swiftプロジェクト全体で多くのprint()
ステートメントがあります。次のようにこれらのリリースでは無視されますように、私は、グローバルオーバーライドを書いて構築します。スウィフト文字列補間性能
func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
#if DEBUG
Swift.print(items, separator: separator, terminator: terminator)
#endif
}
私は時々、例えば、高価なカスタムdebugDescription
プロパティを持つオブジェクトを渡すprint()
を呼び出す:
print("Value of myArray: \(myArray)")
でmyArray
はそうのようなカスタムdebugDescription
を実装:
var debugDescription: String {
get {
// Serialise the array for printing
}
}
私の質問があり、ます文字列をprint()
またはそれ以降に渡す前に、値が計算されるのはですか?私。 #if DEBUG
プリプロセッサディレクティブはリリースビルドから計算を削除しますか?
編集:私はdebugDescription
が計算されたプロパティであることを認識しています。私はそれが呼び出されたときにはわかりません。私はそれを自分では呼んでいません。文字列補間の一部として自動的に呼び出されます。したがって、スウィフトが文字列をprint()
に渡す前に補間しても、プロパティは引き続き計算されます。しかし、Swiftが代わりに "命令"を保存し、内蔵のSwift.print()
ビルトインの文字列を評価するだけであれば、パフォーマンスが向上します。 したがって、この問題は、Swiftがパフォーマンスに関して文字列補間をどのように処理するかについてです。
'debugDescription'は計算されたプロパティなので、' debugDescription'を呼び出すたびに生成されます。しかし、この全体がマイクロ最適化のように聞こえます –
マイクロ最適化とはどういう意味ですか? – Extragorey
ほとんどの場合、その文字列の生成には数ミリ秒かかります。ミリ秒が重要な場合があります。パフォーマンスについての心配 –