2014-02-06 2 views
3

У меня есть 2 метода обрезания суффикса домена из поддомена, и я хотел бы узнать, какой из них быстрее. Как мне это сделать?Как узнать, какой из двух методов работает быстрее?

2 string trimming methods

+0

@Leo Это Go не Java, и я сомневаюсь, что OP использует [jgo] (http://code.google.com/p/jgo/) :) – nemo

+0

Я думаю, что сообщение в блоге переоценивает преимущества оптимизации для 10ns/оп. – elithrar

+0

@nemo Мне очень жаль :-(Позвольте мне исправить это – Leo

ответ

5

Вы можете использовать встроенный benchmark capabilities из go test.

Например (on play):

import (
    "strings" 
    "testing" 
) 


func BenchmarkStrip1(b *testing.B) { 
    for br := 0; br < b.N; br++ { 
     host := "subdomain.domain.tld" 

     s := strings.Index(host, ".") 
     _ = host[:s] 
    } 
} 

func BenchmarkStrip2(b *testing.B) { 
    for br := 0; br < b.N; br++ { 
     host := "subdomain.domain.tld" 

     strings.TrimSuffix(host, ".domain.tld") 
    } 
} 

Магазин этот код в somename_test.go и запустить go test -test.bench='.*'. Для меня это дает следующий вывод:

% go test -test.bench='.*' 
testing: warning: no tests to run 
PASS 
BenchmarkStrip1 100000000   12.9 ns/op 
BenchmarkStrip2 100000000   16.1 ns/op 
ok  21614966 2.935s 

Эталон утилита будет attempt to do a certain number of runs до значимого времени не измеряется что отражается на выходе по количеству 100000000. Код был запущен 100000000 раз, и каждая операция в цикле заняла 12,9 нс и 16,1 нс соответственно. Итак, вы можете сделать вывод, что код в BenchmarkStrip1 выполнен лучше.

Независимо от результата, часто бывает profile your program, чтобы увидеть, где находится реальное узкое место, вместо того, чтобы тратить свое время на микро-тесты, подобные этим.

Я бы также не рекомендовал писать собственный бенчмаркинг, так как есть некоторые факторы, которые вы могли бы сделать не учитывать такие как the garbage collector и running your samples long enough.

+0

Как увеличить частоту дискретизации? Я прочитал статью pprof раньше, но это было слишком сложно с первого взгляда. Он всегда пытался скрутить URL-адрес, а затем сказал, что нет такой файл или каталог. http://pastebin.com/0Ff7DWP7 –

+0

Ну, я собираюсь принять ответ, хотя я до сих пор не знаю, какой из двух методов обрезать строку быстрее, но это достаточно хорошо для общего вопрос/ответ.Если у кого-то есть лучший ответ, я с радостью соглашусь с ним. Попытка time.Now() и .Sub() показали, что метод TrimSuffix() в большинстве случаев был быстрее. Что странно, так это то, что любой метод был до 200ns быстрее/медленнее. Оба начали с 250ns TrimSuffix() приблизились к 70ns, где [: s] были в основном ~ 130 нс. Затем они приблизились к 70ns с нечетным всплеском ~ 250ns TrimSuffix(). Idk как надежное время.() и Sub(). –

+1

Извините, но я испортил бенчмарк пример. Я забыл выполнить тест так часто, как требует эталонный инструмент ('b.N'). Частота выборки контрольного инструмента автоматически определяется, поэтому вы не можете изменять его напрямую, и он не имеет ничего общего с pprof. Я просто хотел, чтобы вы использовали профилирование, прежде чем тратить свое время на микро-тесты, которые в большинстве случаев не решают реальной проблемы в производительности вашего кода. – nemo

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