У меня есть обработчик HTTP с 40 регистраторами, который установлен на os.Stdout .
Это прекрасно работает для меня, так как я сейчас единственный, кто тестирует.
Но, когда дело доходит до производства, я боюсь, что у него будет слишком много накладных расходов.
В настоящее время регистраторы настроены на os.Stdout и os.Stderr .
Но как только он попадет в производство, os.Stdout будет установлен в ioutil.discard .
Q1. Повлияет ли это на производительность, если у меня все еще есть журнал, настроенный на сброс?
Q2. Для лучшей практики, лучше ли полностью удалить регистраторы из обработчика HTTP?
---- ОБНОВЛЕНИЕ ----
package main
import (
"time"
"fmt"
"log"
"io/ioutil"
"io"
)
func testPrintf(w io.Writer, note string, cnt int) {
l := log.New(w, "", 0)
t1 := time.Now()
for i:=0; i<cnt; i++ {
l.Printf("%s - %d", "test", i)
}
t2 := time.Now()
fmt.Printf("%-15s %-15s, %v\n","Printf ", note, t2.Sub(t1))
}
func testPrintln(w io.Writer, note string, cnt int) {
l := log.New(w, "", 0)
t1 := time.Now()
for i:=0; i<cnt; i++ {
l.Println("test" + string(i))
}
t2 := time.Now()
fmt.Printf("%-15s %-15s, %v\n","Println", note, t2.Sub(t1))
}
func testDoNothing(w io.Writer, note string, cnt int) {
//l := log.New(w, "", 0)
t1 := time.Now()
for i:=0; i<cnt; i++ {
_ = "test" + string(i) // evaluated but didn't do any.
}
t2 := time.Now()
fmt.Printf("%-15s %-15s, %v\n", "DoNothing", note, t2.Sub(t1))
}
func main() {
cnt := 10000000 // ten million
testPrintf(ioutil.Discard, "discard.Attempt.1", cnt)
testPrintln(ioutil.Discard, "discard.Attempt.1", cnt)
testDoNothing(ioutil.Discard, "discard.Attempt.1", cnt)
fmt.Println("\n")
testPrintf(ioutil.Discard, "discard.Attempt.2", cnt)
testPrintln(ioutil.Discard, "discard.Attempt.2", cnt)
testDoNothing(ioutil.Discard, "discard.Attempt.2", cnt)
fmt.Println("\n")
testPrintf(ioutil.Discard, "discard.Attempt.3", cnt)
testPrintln(ioutil.Discard, "discard.Attempt.3", cnt)
testDoNothing(ioutil.Discard, "discard.Attempt.3", cnt)
}
--- РЕЗУЛЬТАТ ---
Printf discard.Attempt.1, 2.663697209s
Println discard.Attempt.1, 2.4289759s
DoNothing discard.Attempt.1, 190.480694ms
Printf discard.Attempt.2, 2.493506245s
Println discard.Attempt.2, 2.426081786s
DoNothing discard.Attempt.2, 182.899574ms
Printf discard.Attempt.3, 2.480853275s
Println discard.Attempt.3, 2.481552836s
DoNothing discard.Attempt.3, 180.916608ms
- Я бегал по 10 миллионов раз для каждого.
- 2 ~ 3 сек. Для 10M журнала на io. Дискард быстрее, чем я думал .. Думаю, мне не нужно беспокоиться о скорости.
- os.Stdout, который я не собирался использовать; (Моей первоначальной задачей было сохранение кода с помощью ioutil.Discard против удаления кода), но, поскольку os.Stdout не был буферизован, это было медленно.
- Кстати, printf () был намного быстрее, чем я думал. Почти так же, как println ()
Я не пишу код Go каждый день, поэтому этот тест может быть неточным. Если вы видите вводящую в заблуждение информацию из теста, пожалуйста, оставьте комментарий здесь, чтобы другие знали. Спасибо.