2016-06-10 3 views
3

Принимая это простое сравнение 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 Go (вроде как наброски в приведенных выше фрагментах)?

Пожалуйста, дайте мне знать, если я слишком расплывчата или если что-то пропустил. Спасибо

Update

Когда я сделал firstCharater матч в больших струнах json до действительно сравнения я получил около 3.7% бенчмаркинг прибыли от 100k тяжелых записей:

<some irrelevant inspection code>.. v[0] == firstChar && v == lookFor { 
    // Match found when it reaches here 
} 

код выше (особенно на длинных струнах) быстрее, чем просто для v == lookFor.

+0

да, это делается в сборке, по функции «runtime · eqstring» – JimB

+0

Спасибо за ваш ответ JimB. Вы знаете, как проходит этот процесс? Всегда ли она полностью итеративно и/или сравнивает длину переменной или отменяет ее раньше, когда равная глубина индекса больше не соответствует? –

+0

нет, он всегда сравнивает длину в первую очередь. нет причин для повторения, если они не имеют одинаковой длины. – JimB

ответ

6

Функция обрабатывается в сборе. Версия 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 

И это работа компилятора, чтобы гарантировать, что строки имеют одинаковую длину до того, что называется. (The 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 
} 
+0

Я сделал NASM на старом Mac несколько лет назад. Я должен действительно в этом задуматься, чтобы отлаживать эту шкалу тоже :). Я проголосую за это, когда время перезарядки закончено. Большое спасибо за сотрудничество, как всегда, JimB! –

Смежные вопросы