为了账号安全,请及时绑定邮箱和手机立即绑定

核心语言中的字符串比较

核心语言中的字符串比较

Go
慕村9548890 2022-01-17 17:46:32
拿这个简单的比较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.
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

该函数在汇编中处理。amd64 版本为:


TEXT runtime·eqstring(SB),NOSPLIT,$0-33

    MOVQ    s1str+0(FP), SI

    MOVQ    s2str+16(FP), DI

    CMPQ    SI, DI

    JEQ eq

    MOVQ    s1len+8(FP), BX

    LEAQ    v+32(FP), AX

    JMP runtime·memeqbody(SB)

eq:

    MOVB    $1, v+32(FP)

    RET

在调用之前确保字符串的长度相等是编译器的工作。(该runtime·memeqbody函数实际上是优化内存比较发生的地方,但这里可能不需要发布全文)


等效的 Go 代码将是:


func eqstring_generic(s1, s2 string) bool {

    if len(s1) != len(s2) {

        return false

    }

    for i := 0; i < len(s1); i++ {

        if s1[i] != s2[i] {

            return false

        }

    }

    return true

}


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信