2016-07-04 3 views

答えて

12

はい、に格納されているvalが効率的です。 Kotlin bytecode viewerを使用して、これらのオプションをコンパイルする方法を調べることができます。

  • コンパニオンオブジェクトvalは、実際にこのようにインスタンスのメモリフットプリントを増やす各インスタンスに格納されたインスタンスvalとは異なり、一度だけ保存されている(Stringリテラル:ここ

    は、私はそれがパフォーマンスに影響を与える可能性が気づいたものですis stored in constant poolですが、インスタンスにはそのインスタンスへの参照があります)とインスタンスの作成時間(作成中は、フィールドに値を入力する必要があります)。

  • コンパニオンオブジェクトvalを複数回連続してアクセスすると、CPUキャッシュの方が、valを使用するよりもうまく機能します。locality of referenceが良いでしょう。 valにアクセスするために異なるインスタンスを参照解除すると、CPUキャッシュミスが発生する可能性が高くなります。

    ただし、valが同じクラスのインスタンスメソッド内でのみ使用される場合、この方法はパフォーマンスにほとんど影響しません。この方法はおそらくthisを逆参照する可能性があります。コンパニオンオブジェクト。

  • @JvmStaticを追加すると、アクセスが少し速くなります。それがなければ、値にアクセスするには、静的なCompanionリファレンスを取得し、getSOME_CONST()を呼び出す必要があります。 @JvmStaticでは、静的メソッドgetSOME_CONST()(スキップCompanion)があります。 @JvmFieldもあり、getterを呼び出しなくても直接アクセスできるパブリックフィールドを作成します。

    しかし、JITコンパイラは最初の2つのケースのゲッターアクセスを最適化する可能性が高いため、アノテーションの効果はほとんど目立たないでしょう。

また、別にパフォーマンスから、インスタンスvalは、インスタンスごとに異なる場合があります値の意味を持っているので、companion objectは、より良い地球一定の値の場合に合わせているようです。

関連する問題