大佬教程收集整理的这篇文章主要介绍了当golang为字符串到字节转换进行分配时,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
var testString = "ABCDEFGHIJKLMNOPQRstuVWXYZ" //var testString = "ABCDEFGHIJKLMNOPQRstuVWXYZABCDEFGHIJKLMNOPQRstuVWXYZ" func BenchmarkHashing900000000(b *tesTing.b){ var bufByte = bytes.buffer{} for i := 0; i < b.N ; i++{ bufByte.WriteString(testString) Sum32(bufByte.bytes()) bufByte.Reset() } } func BenchmarkHashingWithNew900000000(b *tesTing.b){ for i := 0; i < b.N ; i++{ bytStr := []byte(testString) Sum32(bytStr) } }
测试结果:
With testString = "ABCDEFGHIJKLMNOPQRstuVWXYZ" BenchmarkHashing900000000-4 50000000 35.2 ns/op 0 B/op 0 allocs/op BenchmarkHashingWithNew900000000-4 50000000 30.9 ns/op 0 B/op 0 allocs/op With testString = "ABCDEFGHIJKLMNOPQRstuVWXYZABCDEFGHIJKLMNOPQRstuVWXYZ" BenchmarkHashing900000000-4 30000000 46.6 ns/op 0 B/op 0 allocs/op BenchmarkHashingWithNew900000000-4 20000000 73.0 ns/op 64 B/op 1 allocs/op
为什么在Bench’sHashingWithNew900000000的情况下,当字符串很长时有分配,但是当字符串很小时没有分配.
Sum32:@L_419_0@
我正在使用go1.6
你可以在这里看到Dmitry Dvyukov的公关
https://go-review.googlesource.com/c/go/+/3120
不幸的是,从很久以前,当编译器是用C语言编写的时候,我不确定在当前编译器中哪里可以找到优化.但我可以确认它仍然存在,而德米特里的公关描述是准确的.
如果你想要一套更清晰的自包含基准来证明这一点,我在这里有一个要点.
https://gist.github.com/fmstephe/f0eb393c4ec41940741376ab08cbdf7e
如果我们只看第二个基准BenchmarkHashingWithNew900000000,我们可以看到它应该分配的明确位置.
bytStr := []byte(testString)
该行必须将testString的内容复制到一个新的[]字节中.但是在这种情况下,编译器可以看到在Sum32返回后,从不再使用bytStr.因此,它可以在堆栈上分配.但是,由于字符串可以任意大,因此对于堆栈分配的字符串或[]字节,限制设置为32字节.
以上是大佬教程为你收集整理的当golang为字符串到字节转换进行分配时全部内容,希望文章能够帮你解决当golang为字符串到字节转换进行分配时所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。