代码之家  ›  专栏  ›  技术社区  ›  codez

两个Uint64的意外加法行为

go
  •  -1
  • codez  · 技术社区  · 6 年前

    问题

    在下面的代码中,我有几个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)
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Henry    6 年前

    这条线

    total = (averageMemoryUsage + usage)
    

    应该是

    total = (total + usage)