美文网首页Golang进阶
【Golang】在循环条件中循环计算slice的长度是否合理

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

作者: qishuai | 来源:发表于2018-03-03 14:58 被阅读6次

    动机:经常在开源项目中看到,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得这个字段一样,那么和访问一个变量在效率也就没有什么区别了。这里的计算,应该不是我想象的那么通过一个算法进行统计。如果有不同意见欢迎讨论学习。

    相关文章

      网友评论

        本文标题:【Golang】在循环条件中循环计算slice的长度是否合理

        本文链接:https://www.haomeiwen.com/subject/ekwtfftx.html