亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

核心語言中的字符串比較

核心語言中的字符串比較

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 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號