! = null VS? .let {} производительность для неизменяемых переменных в kotlin - PullRequest
3 голосов
/ 12 апреля 2019

Насколько я понимаю, большое преимущество ?.let{} перед != null заключается в том, что оно гарантирует, что изменяемое значение не будет изменено внутри блока.

Однако, в случае неизменяемой переменнойразница в производительности?

Например, у меня есть простой метод

private fun test() {
    val x: String? = ""

    if (x != null) {
        print("test")
    }

    x?.let {
        print("test")
    }

}

Когда я вижу получающийся в результате байт-код Kotlin, кажется, что он имеет гораздо больше кода.

Для случая x! = Null:

    LINENUMBER 8 L1
   L2
    LINENUMBER 9 L2
    LDC "test"
    ASTORE 2
   L3
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 2
    INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/Object;)V
   L4
   L5

Для случая x? .Let {}:

    LINENUMBER 12 L5
    ALOAD 1
    ASTORE 2
   L6
   L7
    ALOAD 2
    ASTORE 3
   L8
    ICONST_0
    ISTORE 4
   L9
    LINENUMBER 13 L9
    LDC "test"
    ASTORE 5
   L10
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 5
    INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/Object;)V
   L11
   L12
    LINENUMBER 14 L12
   L13
    NOP
   L14
    LINENUMBER 12 L14
   L15
    NOP
   L16

ЕслиЯ декомпилирую в java, тогда результирующий код кажется похожим с еще одной переменной, назначаемой для let (любопытно, что для переменной int установлено значение false)

For x! = Null:

  String var2 = "test";
  System.out.print(var2);

Forx? .let {}

  int var4 = false;
  String var5 = "test";
  System.out.print(var5);

В конце мой вопрос: отличается ли производительность между let и != для неизменяемых переменных?

...