Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 当使用int64而不是int32时,For循环性能要慢得多_Performance_For Loop_Go_Int - Fatal编程技术网

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

Performance 当使用int64而不是int32时,For循环性能要慢得多,performance,for-loop,go,int,Performance,For Loop,Go,Int,我试图找出与性能相关的最佳实践。 我注意到为for循环指定整数类型可能会显著影响性能(在我的例子中是x2次) 我的问题是,应该是使用int64比使用int32慢很多,还是我的代码中缺少了一些东西 我正在使用的代码: a.go 主程序包 进口( “fmt” “时间” “运行时” “strconv” ) func main(){ 开始:=时间。现在() var x1 int//稍后将所有int更改为int32或int64 对于i:=int(0);我将构建一个 C:\…>a -243309312 23

我试图找出与性能相关的最佳实践。 我注意到为for循环指定整数类型可能会显著影响性能(在我的例子中是x2次)

我的问题是,应该是使用int64比使用int32慢很多,还是我的代码中缺少了一些东西

我正在使用的代码:

a.go

主程序包
进口(
“fmt”
“时间”
“运行时”
“strconv”
)
func main(){
开始:=时间。现在()
var x1 int//稍后将所有int更改为int32或int64
对于i:=int(0);我将构建一个
C:\…>a
-243309312
238.3333ms
gc amd64窗口
64
使用int64输出x1

C:\…>开始构建a.go
C:\…>a
500000000500000000
467.7835ms
gc amd64窗口
64
更新

我尝试了@Giulio Micheloni的建议,得到了更准确的基准

goos: windows
goarch: amd64
BenchmarkInt64-12       1000000000           0.234 ns/op           0 B/op          0 allocs/op
PASS
ok      _/c_/.../.../Desktop    0.402s
Success: Benchmarks passed.

goos: windows
goarch: amd64
BenchmarkInt32-12       1000000000           0.231 ns/op           0 B/op          0 allocs/op
PASS
ok      _/c_/.../.../Desktop    0.403s
Success: Benchmarks passed.

无意义的微基准产生无意义的结果


整数溢出


对于有符号整数,运算+、-、*、/、和无意义的微基准会产生无意义的结果


整数溢出


对于有符号整数,运算是+、-、*、/,这种情况是否一致?@GiulioMicheloni-yesI会运行这样的基准()并确保for循环的迭代次数不在等式中。你能告诉我们上述基准测试的结果吗?我在我的机器上运行了这些测试,得到了两个整数大小的相似结果:Int32-16 0.44ns±0%Int64-16 0.45ns±1%@GiulioMicheloni在你的评论和peterSO的帖子之后,我知道问题出在哪里了。现在,我无法解释elp,但要问一个恼人的问题:为什么go代码比Java代码慢两倍(反问句)。这种情况持续发生吗?@GiulioMicheloni yesI会运行这样一个基准()并确保for循环的迭代次数不在等式中。你能告诉我们上述基准测试的结果吗?我在我的机器上运行了这些测试,得到了两个整数大小的相似结果:Int32-16 0.44ns±0%Int64-16 0.45ns±1%@GiulioMicheloni在你的评论和peterSO的帖子之后,我知道问题出在哪里了。现在,我无法解释elp,但要问一个恼人的问题:为什么go代码比Java代码慢两倍(反问句)@Kingindanord,在进行微基准测试时,请1)不要依赖挂钟计时器,使用股票软件包的基准测试功能;2)确保也使用该软件包来比较不同基准测试的结果;3)确保不要测量基准测试的任何设置和拆卸代码;4)在Go中阅读基准测试,很多。@Kingindanord,在进行微基准测试时,请1)不要依赖挂钟计时器,使用股票包的基准测试功能;2)确保也使用该包来比较不同基准测试的结果;3)确保不要测量基准测试的任何设置和拆卸代码;4)在Go中大量阅读基准测试。
int32   set of all signed 32-bit integers 
        (-2147483648 to 2147483647)
int64   set of all signed 64-bit integers 
        (-9223372036854775808 to 9223372036854775807)
package main

import (
    "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)
}
Overflow: 2147450880 + 65536 = -2147450880
gc amd64 linux
64