编译器是否优化变量声明?

给定一个迭代:


 LOOP:

 for {       

       select {

       case <-timeout:

         t.Fatal("Timed out")

       default:

         if Count() == int64(num) {

            break LOOP

         }

         time.Sleep(5 * time.Millisecond)

       }

    }

Count()返回一个int64,所以我需要转换和Count更改,所以我们在这里检查直到Count()返回预期值 - 可能是数千次迭代。


编译器是否优化此转换?或者在开始循环之前预先将num在其他地方使用过的 asint和 not转换为更好?int64


繁华开满天机
浏览 82回答 2
2回答

墨色风雨

它是否优化可能取决于您未显示的其他代码,以及编译器版本/目标体系结构。虽然我怀疑何时涉及并发和其他函数调用,但性能瓶颈将是int=>int64转换。如果取消该转换,您很可能不会看到任何差异。另请注意,如果您使用的体系结构是 64 位,则int和的大小(以及内存表示和解释)int64是相同的,这意味着转换不会产生任何成本,它只是更改类型(如何解释)。编辑:由于您无论如何都在使用睡眠,因此摆脱转换是没有意义的。使用使您的代码更具可读性的任何一个。

婷婷同学_

Go amd64 汇编器:0000000000457bb0 <main.Equality>:  457bb0:   48 8b 44 24 08          mov    0x8(%rsp),%rax  457bb5:   48 8b 4c 24 10          mov    0x10(%rsp),%rcx  457bba:   48 39 c8                cmp    %rcx,%rax  457bbd:   0f 94 44 24 18          sete   0x18(%rsp)  457bc2:   c3                      retq正如预期的那样,速度很快。编译器知道,对于 amd64,int与int64. 无需转换。opt.go:package main//go:noinlinefunc Equality(a int64, b int) bool {    return a == int64(b)}func main() {    var a, b = int64(42), int(39)    println(Equality(a, b))}倾倒:$ go build opt.go$ objdump -d opt > opt.dump
打开App,查看更多内容
随时随地看视频慕课网APP