Kotlinのconst valとvalの違い

結論から先に。

公式ページ によると、const valにすると、inline化されるようですね。

https://kotlinlang.org/docs/whatsnew11.html#constant-inlining

inlineとはなにか?

Wikipediaを参照すると、高速化のための最適化手法の一つのようですね。

インライン展開(インラインてんかい、: inline expansion または : inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバーヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効果的であり、呼び出し側にそのコードを展開することで定数畳み込みなどのさらなる最適化を施せる可能性が生じる。

https://ja.wikipedia.org/wiki/インライン展開

inline化を行うと、一々変数を呼び出すといったことはせずに、
呼び出し箇所に変数の中身を展開します。

このような場合は、BONUSと書かれているところで、BONUS変数の中身を読み込んで、表示させています。
ふつうのことですね。

class Company {
    companion object {
        private val BONUS: Int = 5
    }

    public fun tellBonus() {
        print("私のボーナスは${BONUS}万円です")
    }
}

fun main(args: Array<String>) {
    val blackCompany = Company()
    blackCompany.tellBonus()
}
実行結果
私のボーナスは5万円です

ただ、const valを使った場合は、異なります。

こちらのように、inlineになると、変数を読み込んで使うという形ではなく、実行前に値を変えておくといったことが行われます。実行前段階で値を変えておくので、実行中では高速に実行されるということですね。

class Company {
    companion object {
        private const val BONUS: Int = 5
    }

    public fun tellBonus() {
        print("私のボーナスは5万円です") // ←const valの場合はここに直接5が入っている
    }
}

fun main(args: Array<String>) {
    val blackCompany = Company()
    blackCompany.tellBonus()
}

まとめ

const valが使える箇所であれば、積極的に使っていったほうが高速化に繋がるので良さそうです!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA