高效的Go语言编码技巧

来源:互联网 发布:电子版通讯录制作软件 编辑:程序博客网 时间:2024/05/15 21:21

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 +操作字符串也很快)

最有效的方式是采用buffer
strBuf := 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快3倍左右吧。

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那样去检查索引,所以速度会快非常多。

欢迎大家简书或我的个人博客与我交流

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 借鉴 借鉴是什么意思 借鉴的近义词 移植与借鉴思维是指 日本韩国值得借鉴创业点子 雷神万化好看借鉴图 踢裆姐妹们值得借鉴9分钟 双胞胎取名楚辞成语借鉴 婚房装修效果图婚房装修借鉴 借钱靠谱 朋友借钱 京东借钱 梦见借钱 哪里借钱 小花借钱 马上借钱app 58借钱 怎样借钱 银行卡借钱 找谁借钱 免费借钱 借钱用app 关于借钱 简单借钱 借钱歌 借钱的技巧 要借钱网 借钱么 借钱专家 借钱图片 借钱花app 那里好借钱 男朋友借钱 借钱借钱 在哪里借钱 哪里好借钱 我需要借钱 如果借钱 我想借钱谁私人借钱2万 哪里借钱快 借钱的理由