两个 Uint64 的意外加法行为

问题


在下面的代码中,我有几个 Go 例程,我面临的一个问题是“calculateMemoryUsage()”Go 例程,其中每半秒计算一次平均内存使用量。出于某种原因,总数不断给我奇怪的值。这是打印日志:


Memory Usage: 162224

Average: 162224

Total: 162224

Iteration Count: 1


Memory Usage: 181200

Average: 171712

Total: 343424

Iteration Count: 2


Memory Usage: 187864

Average: 119858

Total: 359576

Iteration Count: 3

正如所见,从第三次迭代开始,平均值出现了混乱,因为总数没有正确添加。调试后,我看到内存使用情况读取良好,但总似乎给我带来了问题。我怀疑 GC,但是在这个问题中,LastGC 的值设置为 0,这意味着没有执行 GC。任何建议将不胜感激!:)


代码


func main() {

    db, err := sql.Open("mysql", "<credentials_removed>@@tcp(127.0.0.1:3306)/rts")


    err = db.Ping()

    if err != nil {

        panic(err.Error()) // proper error handling instead of panic in your app

    }


    showStocksChannel := make(chan bool)

    showBestPerformingChannel := make(chan bool)




    go calculateMemoryUsage()

    go showStocks(showStocksChannel, db)

    go changeStockPrices(showStocksChannel, showBestPerformingChannel, db)

    go displayBestPerformingStocks(showBestPerformingChannel, db)


    showStocksChannel <- true


    select{}

}

func calculateMemoryUsage() {

    var averageMemoryUsage uint64 = 0

    var iterations uint64 = 0

    var usage uint64 = 0

    var total uint64 = 0


    for iterations <= 200 {

        var memoryStats runtime.MemStats

        runtime.ReadMemStats(&memoryStats)


        iterations = iterations + 1


        usage = memoryStats.Alloc

        total = (averageMemoryUsage + usage)

        averageMemoryUsage = total / iterations


        fmt.Printf("\nMemory Usage: %v\nAverage: %v\nTotal: %v\nIteration Count: %v\n\n", usage, averageMemoryUsage, total, iterations)




        time.Sleep(time.Millisecond * 1000)

        //fmt.Printf("\nLast GC: %v\nNext GC: %v\n\n", memoryStats.LastGC, memoryStats.NextGC)



    }


    fmt.Printf("\nAverage Memory Usage: %v bytes\n\n", averageMemoryUsage)

}


慕的地6264312
浏览 179回答 1
1回答

缥缈止盈

这条线total&nbsp;=&nbsp;(averageMemoryUsage&nbsp;+&nbsp;usage)应该total&nbsp;=&nbsp;(total&nbsp;+&nbsp;usage)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go