猿问

核心语言中的字符串比较

拿这个简单的比较loopValue == "Firstname",下面的说法是真的吗?


如果检查第一个的内部操作数char与比较字符串不匹配,它将提前中止


所以采取更原始的形式loopValue,"Firstname"两者都是[]byte。它会像回调循环一样遍历数组:


someInspectionFunc(loopValue, "Firstname", func(charA, charB) {

    return charA == charB

})

...让它继续运行,直到它碰撞false并检查数量iterations是否等于它们的长度。它也先检查长度吗?


if len(loopValue) != len("Firstname") {

    return false

}

我真的无法go在 GitHub 上的源代码中找到解释,因为它比我高一点。


我问这个的原因是因为我正在做大数据处理并且正在做基准测试并做 cpu、内存和分配pprof以从这个过程中挤出更多的汁液。从这个过程中,我开始思考 Go(但也只是一般的 C)将如何在引擎盖下做到这一点。这完全是在汇编级别上,还是已经在本机 Go 代码中进行了比较(有点像上面的片段中所描绘的)?


如果我太模糊或者我错过了什么,请告诉我。谢谢


更新


当我firstCharater在大字符串中进行匹配时json,在真正比较之前,我得到了3.7%100k 重条目的基准增益:


<some irrelevant inspection code>.. v[0] == firstChar && v == lookFor {

    // Match found when it reaches here

}

上面的代码(尤其是在长字符串上)比只使用v == lookFor.


慕村9548890
浏览 176回答 1
1回答

守着星空守着你

该函数在汇编中处理。amd64 版本为:TEXT runtime·eqstring(SB),NOSPLIT,$0-33&nbsp; &nbsp; MOVQ&nbsp; &nbsp; s1str+0(FP), SI&nbsp; &nbsp; MOVQ&nbsp; &nbsp; s2str+16(FP), DI&nbsp; &nbsp; CMPQ&nbsp; &nbsp; SI, DI&nbsp; &nbsp; JEQ eq&nbsp; &nbsp; MOVQ&nbsp; &nbsp; s1len+8(FP), BX&nbsp; &nbsp; LEAQ&nbsp; &nbsp; v+32(FP), AX&nbsp; &nbsp; JMP runtime·memeqbody(SB)eq:&nbsp; &nbsp; MOVB&nbsp; &nbsp; $1, v+32(FP)&nbsp; &nbsp; RET在调用之前确保字符串的长度相等是编译器的工作。(该runtime·memeqbody函数实际上是优化内存比较发生的地方,但这里可能不需要发布全文)等效的 Go 代码将是:func eqstring_generic(s1, s2 string) bool {&nbsp; &nbsp; if len(s1) != len(s2) {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; for i := 0; i < len(s1); i++ {&nbsp; &nbsp; &nbsp; &nbsp; if s1[i] != s2[i] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return true}
随时随地看视频慕课网APP

相关分类

Go
我要回答