为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁华开满天机 2023-08-14 16:20:19
给定一个迭代: 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
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

它是否优化可能取决于您未显示的其他代码,以及编译器版本/目标体系结构。虽然我怀疑何时涉及并发和其他函数调用,但性能瓶颈将是int=>int64转换。如果取消该转换,您很可能不会看到任何差异。

另请注意,如果您使用的体系结构是 64 位,则int和的大小(以及内存表示和解释)int64是相同的,这意味着转换不会产生任何成本,它只是更改类型(如何解释)。

编辑:由于您无论如何都在使用睡眠,因此摆脱转换是没有意义的。使用使您的代码更具可读性的任何一个。


查看完整回答
反对 回复 2023-08-14
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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,intint64. 无需转换。


opt.go:

package main


//go:noinline

func 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


查看完整回答
反对 回复 2023-08-14
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信