使用 int64 而不是 int32 时,for 循环性能要慢得多

我正在尝试找出有关性能的最佳实践。我注意到为 for 循环指定整数类型可能会极大地影响性能(在我的例子中是 x2 倍)。


我的问题是,使用 int64 是否应该比使用 int32 慢得多,或者我在代码中遗漏了一些东西?


我正在使用的代码:



package main


import (

    "fmt"

    "time"

    "runtime"

    "strconv"

)


func main() {

    start := time.Now()

    var x1 int // later change all int to int32 or int64 


    for i := int(0); i <= int(1000000000); i++  {

        x1 = x1 + i

    }

        t := time.Now()

        elapsed := t.Sub(start)


    fmt.Println(x1)

    fmt.Println(elapsed)

    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)

    fmt.Println(strconv.IntSize)

}

使用 int32 作为 x1 的输出


C:\...>go build a.go

C:\...>a


-243309312

238.3333ms

gc amd64 windows

64

使用 int64 作为 x1 的输出


C:\...>go build a.go

C:\...>a


500000000500000000

467.7835ms

gc amd64 windows

64


繁华开满天机
浏览 86回答 0
0回答

婷婷同学_

无意义的微基准测试会产生无意义的结果。Go 编程语言规范数字类型int32   set of all signed 32-bit integers         (-2147483648 to 2147483647)int64   set of all signed 64-bit integers         (-9223372036854775808 to 9223372036854775807)算术运算符整数溢出对于有符号整数,运算 +、-、*、/ 和 << 可能合法溢出,并且结果值存在,并且由有符号整数表示、运算及其操作数确定性定义。溢出不会导致运行时恐慌。溢出!package mainimport (    "fmt"    "math"    "runtime"    "strconv"    "time")func main() {    start := time.Now()    var x1 int32 // later change all int to int32 or int64    for i := int32(0); i <= int32(1000000000); i++ {        if int64(x1)+int64(i) > math.MaxInt32 {            fmt.Println("Overflow:", x1, "+", i, "=", x1+i)            break        }        x1 = x1 + i    }    t := time.Now()    elapsed := t.Sub(start)    fmt.Println(x1)    fmt.Println(elapsed)    fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)    fmt.Println(strconv.IntSize)}游乐场:https://play.golang.org/p/bdhB4ABf7jY输出:Overflow: 2147450880 + 65536 = -2147450880gc amd64 linux64
打开App,查看更多内容
随时随地看视频慕课网APP