diff --git a/.gitignore b/.gitignore index 8d548ff..39aa122 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ -.vscode \ No newline at end of file +.vscode +*.log \ No newline at end of file diff --git a/go/readdelay/main.go b/go/readdelay/main.go new file mode 100644 index 0000000..3884f9b --- /dev/null +++ b/go/readdelay/main.go @@ -0,0 +1,137 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "log" + "os" + "strconv" + "strings" +) + +const ( + Send = "二进制消息 2.6 kB" + Recieve = "二进制消息 3.9 kB" + Broadcast = "二进制消息 16 B" +) + +type message struct { + Type int + Size int + Time int64 +} + +func time2int64(t string)int64{ + strs := strings.Split(t, ":") + if len(strs) != 3 { + return 0 + } + hour := strs[0] + minute := strs[1] + seconds := strings.Split(strs[2], ".") + if len(seconds) != 2 { + return 0 + } + second := seconds[0] + mill := seconds[1] + + ms, err := strconv.ParseInt(mill, 10, 64) + if err != nil { + log.Println(err) + return 0 + } + h, err := strconv.ParseInt(hour, 10, 64) + if err != nil { + log.Println(err) + return 0 + } + ms = ms + h *3600*1000 + m, err := strconv.ParseInt(minute, 10, 64) + if err != nil { + log.Println(err) + return 0 + } + ms = ms + m * 60 *1000 + s, err := strconv.ParseInt(second, 10, 64) + if err != nil { + log.Println(err) + return 0 + } + ms = ms + s *1000 + return ms +} + +func readdelay(file string)([]message, error){ + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + reader := bufio.NewReader(f) + res := []message{} + t := 0 + for { + line, err := reader.ReadString('\n') + if err != nil { + if err == io.EOF { + return res, nil + } + return res, err + } + line = strings.Trim(strings.Trim(strings.Trim(line, " "), "\t"), "\n") + switch { + case strings.Contains(line, Send): + t = 1 + case strings.Contains(line, Recieve): + t = 2 + case strings.Contains(line, Broadcast): + t = 3 + default: + msg := message{Type: t, Time: time2int64(line)} + switch t { + case 1 : + res = append(res, msg) + case 2: + res = append(res, msg) + } + t = 0 + } + } +} + +func avg(delays ...int64)int64{ + if len(delays) == 0 { + return 0 + } + var total int64 + for _, d := range delays { + total = total + d + } + return total/int64(len(delays)) +} + +func main(){ + var file string + flag.StringVar(&file, "f", "delay.log", "ssss") + flag.Parse() + messages, err := readdelay(file) + if err != nil { + log.Fatal(err) + } + log.Println("got ", len(messages), " messages") + delays := []int64{} + var start int64 + for _, msg := range messages { + if msg.Type == 1 { + start = msg.Time + } + if start != 0 && msg.Type == 2 { + delay := msg.Time - start + start = 0 + delays = append(delays, delay) + } + } + fmt.Println(avg(delays...)) +} \ No newline at end of file