2

XCode(4.6)の最新のアップデートで気づいたのですが、の数行について警告が表示されましたJSONKit.m。具体的には、オブジェクトのクラスを設定する行:

dictionary->isa = _JKDictionaryClass;

これらは非推奨としてマークされており、推奨される方法はobject_setClass()次の方法を使用することでした。

object_setClass(dictionary, _JKDictionaryClass);

警告を単に消音することが好ましい理由を尋ねたところ、次のように答えました。

新しいXcodeバージョンが文句を言っても
、すべてが正常に機能します。1)JSONKitを使用する各プロジェクトをテストして、object_setClass()の後にすべてが正常に機能するかどうかを確認します。2
)CPUサイクルが緩いため、JSONKitを使用します。たとえば、NSJSONSerializationを介して。私の現在のアプリケーションは、600K-1Mの重みを持つjsonファイルを解析します

ここで話しているのは、パフォーマンスのヒットのどれだけですか?

もっと興味があります

dictionary->isa = _JKDictionaryClassvsobject_setClass()

JSONKit対よりNSJSONSerialization

4

2 に答える 2

10

推論はパフォーマンスヒットとは何の関係もありませんし、決してしませんでした。ポインターを持つオブジェクトの定義はisa実装の詳細であり、少なくともObjective-C 2.0以降(そして概念的にはずっと長くなっています)です。isaClangコンパイラの人々とApple、特にランタイムの最適化に携わる人々は、このフィールドを常に維持するのではなく、オブジェクトを最速の内部構造を持つものとして定義できることを望んでいます。存在するという事実isa、すべてのオブジェクトの先頭に存在するという事実、およびisaが単なるClassポインターであるという事実は、理論的には常に変更される可能性があります。互換性が失われると何よりも原因となるため、この時点までは変更されていません。

object_setClassまた、 vsのパフォーマンス特性はobject->isa = blah少し冗談です。CPUは、ハードウェアレベルで、コードに影響を与えるずっと前に、関数呼び出しのオーバーヘッドを最適化する傾向があります。関係するサイクル数について心配している場合pushq %rbp; movq %rsp, %rbp; movq %rsi, (%rdi); popq %rbp; retは、Objective-Cの問題ドメインにはもういません。コードが5つの命令によって作成されたものに敏感である場合は、すでにCまたはアセンブリ言語レベルで作業している必要があります。 。

そして、それを除けば、そもそもこの方法でオブジェクトのクラスを設定する理由はほとんどありません。なぜあなたはこれをしているのですか、そしてそれはあなたにとってどのように役立ちますか?

最後に、Clangチームには、この種の「パフォーマンス」「問題」に対処するためだけに警告を追加するよりも、やるべきことがあると付け加えるかもしれません。ほとんどすべての警告(すべてではありませんが、ほとんど)は、テストしているケースで現時点で機能している場合でも、何か間違ったことをしていることを意味します。このコードは、タグ付きポインターを使用するオブジェクトではすでに壊れています。これは、Xcodeがあなたに伝えようとしていることです。

編集:質問は警告自体の理由ではなく、問題の関数の特定のパフォーマンス特性に関するものであることが私に指摘されました。私の回答で述べたように、パフォーマンスへの影響は非常に小さいため、コードに関連している場合は、そもそもObjective-Cを使用するべきではありません。元の質問を誤解してしまったことをお詫びします。

于 2013-02-20T19:38:27.150 に答える
3

その理由は、関数呼び出しには常にある程度のオーバーヘッドがあるためです。引数をスタックにプッシュし(そして呼び出し元が保存したレジスターも)、命令ポインターを更新し、関数が戻ったときにこれをすべて逆に実行する必要があります。一般に、ポインタを単に逆参照するよりも計算コストが高くなります(これは。のように単純な場合があります)mov [dest] [src]

于 2013-02-20T18:10:56.180 に答える