+操做字符串很方便,可是真的很慢,在Go语言里使用+会致使你的程序跑得可能比脚本语言还满,不相信的能够本身作个测试,用+操做,迭代十万次,Python、Javascript都比Go快不少(是不少噢,不是一点点)python
func TestStr(t *testing.T) { str := "" for i := 0; i < 100000; i++ { str += "test" } }
测试结果性能
PASS: TestStr (3.32s)
str="" for i in range(100000): str+="test"
测试结果:测试
~/» time python test.py
0.03s user 0.03s system 81% cpu 0.078 total
做为静态语言的Go,竟然在这么一个段简单的代码上执行效率比Python慢了100倍,难以想象吧?不是Go的问题,而是在Go中使用+处理字符串是很消耗性能的,而Python应该是对+操做字符串进行了重载优化。(Javascript +操做字符串也很快)优化
strBuf := bytes.NewBufferString("") for i := 0; i < 100000; i++ { strBuf.WriteString("test") }
结果能够本身测试,会让你很惊讶spa
有一些须要简单组合两个字符串,用Buffer麻烦了点,比较容易让人想到的就是用fmt.Sprintf()来组合,不少包里的源码也是这么写的。其实fmt的Sprintf也很是慢,若是没有复杂的类型转换输出的状况下,使用strings.Join性能会高不少code
func TestStr(t *testing.T) { a, b := "Hello", "world" for i := 0; i < 1000000; i++ { fmt.Sprintf("%s%s", a, b) //strings.Join([]string{a, b}, "") } }
PASS: TestStr (0.29s)
func TestStr(t *testing.T) { a, b := "Hello", "world" for i := 0; i < 1000000; i++ { //fmt.Sprintf("%s%s", a, b) strings.Join([]string{a, b}, "") } }
PASS: TestStr (0.09s)
从结果来看strings.Join 比用Sprint快4倍左右吧。blog
举个简单的例子索引
func TestData(t *testing.T) { for i := 0; i < 100000000; i++ { var a struct { Name string Age int } a.Name = "Hello" a.Age = 10 } }
PASS: TestData (0.04s)
func TestData2(t *testing.T) { for i := 0; i < 100000000; i++ { var a = map[string]interface{}{} a["Name"] = "Hello" a["Age"] = 10 } }
PASS: TestData2 (38.30s)
相差上千倍的效率呢!
在可以知道字段的状况下,用临时Struct在运行期间不须要动态分配内容,而且不须要像map那样去检查索引,因此速度会快很是多。ip