type dummy struct { Foo string`json:"foo"` Bar string`json:"bar"` }
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" const ( letterIdxBits = 6// 6 bits to represent a letter index letterIdxMask = 1<<letterIdxBits - 1// All 1-bits, as many as letterIdxBits letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits )
funcRandString(n int)string { b := make([]byte, n) // A rand.Int63() generates 63 random bits, enough for letterIdxMax letters! for i, cache, remain := n-1, rand.Int63(), letterIdxMax; i >= 0; { if remain == 0 { cache, remain = rand.Int63(), letterIdxMax } if idx := int(cache & letterIdxMask); idx < len(letterBytes) { b[i] = letterBytes[idx] i-- } cache >>= letterIdxBits remain-- } returnstring(b) }
funcdummyData()interface{} { return dummy{ Foo: RandString(12), Bar: RandString(16), } }
funcmain() {
// logrus var x int64 = 0 t := time.Now() for i := 0; i < 10000; i++ { logrus.WithField("Dummy", dummyData()).Infoln("this is a dummy log") } x += time.Since(t).Nanoseconds()
// zap zlogger, _ := zap.NewProduction() sugar := zlogger.Sugar() var y int64 = 0 t = time.Now() for i := 0; i < 10000; i++ { sugar.Infow("this is a dummy log", "Dummy", dummyData()) } y += time.Since(t).Nanoseconds()
// stdlog var z int64 = 0 t = time.Now() for i := 0; i < 10000; i++ { dummyStr, _ := json.Marshal(dummyData()) log.Printf("this is a dummy log: %s\n", string(dummyStr)) } z += time.Since(t).Nanoseconds()
// glog var w int64 = 0 t = time.Now() for i := 0; i < 10000; i++ { glog.Info("\nthis is a dummy log: ", dummyData()) } w += time.Since(t).Nanoseconds()
// print fmt.Println("=====================") fmt.Printf("Logrus: %5d ns per request \n", x/10000) fmt.Printf("Zap: %5d ns per request \n", y/10000) fmt.Printf("StdLog: %5d ns per request \n", z/10000) fmt.Printf("Glog: %5d ns per request \n", w/10000) }
/* ===================== Logrus: 19305 ns per request Zap: 1095 ns per request StdLog: 7137 ns per request Glog: 12070 ns per request */