1 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
更換
split_line := strings.Fields(line)
和
split_line := strings.SplitN(line, " ", 11)
在1M行隨機(jī)生成的文件中,模仿您上面提供的格式,速度提高了約4倍:
strings.Fields版本:在4.232525975s中完成
strings.SplitN版本:在1.111450755s中完成
效率的提高部分來自于避免在分割持續(xù)時(shí)間后解析和分割輸入線,但大部分來自于SplitN中更簡(jiǎn)單的分割邏輯。即使拆分所有字符串,也不會(huì)比在持續(xù)時(shí)間之后停止花費(fèi)很長(zhǎng)時(shí)間。使用:
split_line := strings.SplitN(line, " ", -1)
1.554971313s完成
SplitN和字段不相同。字段假定標(biāo)記由1個(gè)或多個(gè)空格字符限制,其中SplitN將標(biāo)記視為由分隔符字符串限制的任何字符。如果輸入的標(biāo)記之間有多個(gè)空格,則split_line將為每對(duì)空格包含空標(biāo)記。
排序和計(jì)算中位數(shù)不會(huì)增加太多時(shí)間。為了方便起見,我將代碼更改為使用float64而不是float32。這是完整的程序:
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
"time"
)
// SortKeys returns a sorted list of key values from a map[int][]float64.
func sortKeys(items map[int][]float64) []int {
keys := make([]int, len(items))
i := 0
for k, _ := range items {
keys[i] = k
i++
}
sort.Ints(keys)
return keys
}
// Median calculates the median value of an unsorted slice of float64.
func median(d []float64) (m float64) {
sort.Float64s(d)
length := len(d)
if length%2 == 1 {
m = d[length/2]
} else {
m = (d[length/2] + d[length/2-1]) / 2
}
return m
}
func main() {
data := make(map[int][]float64)
infile, err := os.Open("sample.log")
defer infile.Close()
if err != nil {
panic(err)
}
reader := bufio.NewReaderSize(infile, 256*1024)
s := time.Now()
for {
line, err := reader.ReadString('\n')
if len(line) == 0 {
break
}
if err != nil {
panic(err)
}
split_line := strings.SplitN(line, " ", 11)
num_packets, err := strconv.ParseFloat(split_line[7], 32)
if err != nil {
panic(err)
}
duration, err := strconv.ParseFloat(split_line[9], 32)
if err != nil {
panic(err)
}
pkts := int(num_packets)
data[pkts] = append(data[pkts], duration)
}
for _, k := range sortKeys(data) {
fmt.Printf("pkts: %d, median: %f\n", k, median(data[k]))
}
fmt.Println("\nCompleted in ", time.Since(s))
}
并輸出:
pkts: 0, median: 0.498146
pkts: 1, median: 0.511023
pkts: 2, median: 0.501408
...
pkts: 99, median: 0.501517
pkts: 100, median: 0.491499
Completed in 1.497052072s
- 1 回答
- 0 關(guān)注
- 290 瀏覽
添加回答
舉報(bào)