在使用字节切片(或数组)时,有哪些优化go(golang)代码的技巧?

时间:2014-08-12 00:42:02

标签: arrays string performance optimization go

我想知道新手程序员在写作时可能遇到的一些常见陷阱(无意中缓慢的代码)。

1)首先,我知道在python中进行字符串连接可以(或曾经很昂贵),在尝试将一个元素添加到字符串时是否相同?如“你好”+“世界”。

2)另一个问题是我经常不得不用一个更多字节的列表来扩展我的切片(而不是一次一个字节)。通过执行以下操作,我有一种“肮脏”的方式来附加它:

newStr := string(arrayOfBytes) + string(newBytesToAppend)

这比仅仅做一些事情慢吗?

for _, b := range newBytesToAppend{
    arrayOfBytes = append(arrayOfBytes, b)
}

或者是否有更好的方法将整个切片附加到其他切片或者可能是内置方式?我觉得有点奇怪,我甚至不得不编写自己的扩展函数(甚至是基准测试)

此外,有时我最终必须循环遍历字节切片的每个元素,为了便于阅读,我将当前字节的类型更改为字符串。如:

for _, b := range newBytesToAppend{
    c := string(b)
    //some more logic on c
    logic(c) //logic
}

3)我想知道,如果go中的转换类型是昂贵的(特别是在字符串到数组之间),并且如果这可能是使代码变慢的因素之一。顺便说一句,有时我经常改变类型(到字符串)非常,几乎每次迭代。

但更一般地说,我试图在网上搜索一系列提示,这些提示通常会导致代码变慢并试图改变它以便它不会(但没有那么多运气) )。我非常清楚这取决于应用程序到应用程序,但是想知道是否有任何“专家”建议通常会使“新手”代码变慢。

4)我能想到的最后一件事是,有时我事先知道切片的长度,所以我可以使用固定长度的数组。这有什么改变吗?

5)我也制作了自己的类型:

type Num int

type Name string

那些会影响性能吗?

6)是否有一个通用的启发式列表需要注意进行代码优化?例如,解除引用问题,因为它可能在C?

1 个答案:

答案 0 :(得分:2)

使用bytes.Buffer / Buffer.Write,它会为您重新调整内部切片的大小,它是目前管理多个[]byte的最有效方法。

关于第二个问题,使用简单的基准测试很容易回答。