smalls的头像

smalls

一个22岁的菜鸟程序员

我的技能

PHP

JAVA

JS

GO

PYTHON

go两个表达式执行效率对比
//表达式1
package main

type person struct {
   age int
}

func main() {
  var p = &person{1}
  println(p)
}
//表达式2
package main

type person struct {
   age int
}

func main() {
  var p = &person{1}
  var np = &p
  println(np)
}

这两个表达式执行效率到底是哪个更快呢?

我们可以用 go tool compile -S main.go来查看编译的汇编进行对比

        //该内容是由表达式1 编译的汇编
        //这下面生成的汇编代码我们看到main.go:8
        0x0000 00000 (main.go:7)        TEXT    "".main(SB), ABIInternal, $32-0
        0x0000 00000 (main.go:7)        MOVD    16(g), R1
        0x0004 00004 (main.go:7)        PCDATA  $0, $-2
        0x0004 00004 (main.go:7)        MOVD    RSP, R2
        0x0008 00008 (main.go:7)        CMP     R1, R2
        0x000c 00012 (main.go:7)        BLS     76
        0x0010 00016 (main.go:7)        PCDATA  $0, $-1
        0x0010 00016 (main.go:7)        MOVD.W  R30, -32(RSP)
        0x0014 00020 (main.go:7)        MOVD    R29, -8(RSP)
        0x0018 00024 (main.go:7)        SUB     $8, RSP, R29
        0x001c 00028 (main.go:7)        FUNCDATA        ZR, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        0x001c 00028 (main.go:7)        FUNCDATA        $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
        //可以看到var p = &person{1}就是main.go:8
        0x001c 00028 (main.go:8)        MOVD    ZR, ""..autotmp_2-8(SP)
        0x0020 00032 (main.go:8)        MOVD    $1, R0
        0x0024 00036 (main.go:8)        MOVD    R0, ""..autotmp_2-8(SP)
        0x0028 00040 (main.go:9)        PCDATA  $1, ZR
        0x0028 00040 (main.go:9)        CALL    runtime.printlock(SB)
        0x002c 00044 (main.go:9)        MOVD    $""..autotmp_2-8(SP), R0
        0x0030 00048 (main.go:9)        MOVD    R0, 8(RSP)
        0x0034 00052 (main.go:9)        CALL    runtime.printpointer(SB)
        //该内容是由表达式2 编译的汇编
        //这下面生成的汇编代码我们看到main.go:8
        0x0000 00000 (main.go:7)        TEXT    "".main(SB), ABIInternal, $48-0
        0x0000 00000 (main.go:7)        MOVD    16(g), R1
        0x0004 00004 (main.go:7)        PCDATA  $0, $-2
        0x0004 00004 (main.go:7)        MOVD    RSP, R2
        0x0008 00008 (main.go:7)        CMP     R1, R2
        0x000c 00012 (main.go:7)        BLS     84
        0x0010 00016 (main.go:7)        PCDATA  $0, $-1
        0x0010 00016 (main.go:7)        MOVD.W  R30, -48(RSP)
        0x0014 00020 (main.go:7)        MOVD    R29, -8(RSP)
        0x0018 00024 (main.go:7)        SUB     $8, RSP, R29
        0x001c 00028 (main.go:7)        FUNCDATA        ZR, gclocals·69c1753bd5f81501d95132d08af04464(SB)
        0x001c 00028 (main.go:7)        FUNCDATA        $1, gclocals·9fb7f0986f647f17cb53dda1484e0f7a(SB)
        0x001c 00028 (main.go:7)        FUNCDATA        $2, "".main.stkobj(SB)
        //这里可以看到生成的汇编和表达式1生成的汇编是一致
        //var p = &person{1}
        //var np = &p,其中看不到main.go:9
        0x001c 00028 (main.go:8)        MOVD    ZR, ""..autotmp_3-16(SP)
        0x0020 00032 (main.go:8)        MOVD    $1, R0
        0x0024 00036 (main.go:8)        MOVD    R0, ""..autotmp_3-16(SP)
        0x0028 00040 (main.go:8)        MOVD    $""..autotmp_3-16(SP), R0
        0x002c 00044 (main.go:8)        MOVD    R0, "".p-8(SP)
        0x0030 00048 (main.go:10)       PCDATA  $1, $1
        0x0030 00048 (main.go:10)       CALL    runtime.printlock(SB)
        0x0034 00052 (main.go:10)       MOVD    $"".p-8(SP), R0
        0x0038 00056 (main.go:10)       MOVD    R0, 8(RSP)
        0x003c 00060 (main.go:10)       PCDATA  $1, ZR
        0x003c 00060 (main.go:10)       CALL    runtime.printpointer(SB)
        0x0040 00064 (main.go:10)       CALL    runtime.printnl(SB)
        0x0044 00068 (main.go:10)       CALL    runtime.printunlock(SB)

可以看到,这里的一行版本的代码和两行版本的代码最终编译出的结果是完全一致的,没有任何区别

总结:两个表达式生成的汇编都是一致的,所以执行效率是一样的

给作者打赏一下吧

文章评论

暂无评论
留言板
评论