Golang进阶

【Golang】在循环条件中循环计算slice的长度是否合理

2018-03-03  本文已影响6人  qishuai

动机:经常在开源项目中看到,for循环中重复计算一个表达式,而这个表达式的值是固定的,这样做是不是会影响性能。抽时间做了一个基准测试,测试很简单,但是解除了我内心的困惑。有相同强迫症的同学,可以参考,可以提意见。

下面是基准测试代码:

package test

import "testing"

func BenchmarkAssign(t *testing.B) {
    s := make([]int, 10000)

    t.ResetTimer()

    for i := 0; i < t.N; i++ {
                length := len(s)
        for j := 0; j < length; j++ {

        }
    }
}

func BenchmarkCalculate(t *testing.B) {
    s := make([]int, 10000)

    t.ResetTimer()

    for i := 0; i < t.N; i++ {
        for j := 0; j < len(s); j++ {

        }
    }
}

func BenchmarkAssignIf(t *testing.B) {
    s := make([]int, 9999)

    t.ResetTimer()

    for i := 0; i < t.N; i++ {
                length := len(s)
        if length < 10000 {
            var _ = length
        }
    }
}

func BenchmarkCalculateIf(t *testing.B) {
    s := make([]int, 9999)

    t.ResetTimer()

    for i := 0; i < t.N; i++ {
        if len(s) < 10000 {
            var _ = len(s)
        }
    }
}

测试结果:

基准测试

发现不管是在循环结构、分支结构,把计算结果储存起来还是重复计算这个表达式,对测试结果并没有影响。

-benchmem参数会每次操作会参数多少次内存分配(allocs/op)和每次分配消耗多少byte(B/op);但是它只会统计堆里面的内存分配情况。

对结果的猜测,slice的长度字段,是slice的一个属性,容量应该也是相同情况,计算一个slice长度就等于取slice得这个字段一样,那么和访问一个变量在效率也就没有什么区别了。这里的计算,应该不是我想象的那么通过一个算法进行统计。如果有不同意见欢迎讨论学习。

上一篇下一篇

猜你喜欢

热点阅读