php调用go速度不匹配问题,Go语言之两个高效小技巧

本篇文章将和大家分享Go语言的两个高效小技巧:这其一是不要使用+和fmt.Sprintf操作字符串;其二是对于固定字段的键值对,用临时Struct,不要用map[string]interface{}。

1.不要使用+和fmt.Sprintf操作字符串

+操作字符串很方便,但是真的很慢,在Go语言里使用+会导致你的程序跑得可能比脚本语言还满,不相信的可以自己做个测试,用+操作,迭代十万次,Python、Javascript都比Go快很多(是很多噢,不是一点点)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 +操作字符串也很快)

最有效的方式是采用bufferstrBuf := bytes.NewBufferString("")

for i := 0; i < 100000; i++ {

strBuf.WriteString("test")

}

结果可以自己测试,会让你很惊讶

有一些需要简单组合两个字符串,用Buffer麻烦了点,比较容易让人想到的就是用fmt.Sprintf()来组合,很多包里的源码也是这么写的。其实fmt的Sprintf也非常慢,如果没有复杂的类型转换输出的情况下,使用strings.Join性能会高很多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倍左右吧。

2.对于固定字段的键值对,用临时Struct,不要用map[string]interface{}

举个简单的例子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那样去检查索引,所以速度会快非常多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值