试图通过一个简单的速度测试来了解Gomaps
是如何工作的。
只提取一个键的值(通过索引)真的很快,根据我下面的代码,我说的是平均在~50.0µs
左右。
当我拉出包含唯一键值和少量其他键的整个记录时。我得到的速度在~500.0µs
上下波动。我知道这已经很快了,不到一毫秒。但是,如果整个记录已经被索引,为什么要花费几乎10倍的时间呢?
它是额外的键的记录,必须处理,需要更多的运行时间?
我是否在代码中使用了错误的映射?随着时间的推移,数据越来越多,这是值得担心的事情吗?
我甚至根据我正在搜索的唯一键对结构进行排序。
type TravelItenariesCSV struct {
...
FlightNum int `csv:"flight_num"`
...
}
// Print code run time
func PrintExecutionTime(t time.Time) {
fmt.Println("Execution time: ", time.Since(t))
}
flightNum := vars["flight"] // Get unique int value that I need to find across all TravelItenariesCSV.FlightNum keys
startTime := time.Now()
itenariesMap := map[int]int{}
for _, v := range s.TravelItenariesCSV { //s.TravelItenariesCSV is a slice of the struct above
itenariesMap[v.FlightNum] = i
}
if v, ok := itenariesMap[i]; ok {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, utils.PrettyPrint(s.TravelItenariesCSV[v])) // this takes ~500.0µs
//fmt.Fprintf(w, utils.PrettyPrint(v)) // this takes ~50.0µs
}
defer utils.PrintExecutionTime(startTime)
请将主题说明清楚。
您的性能度量包含其他元素:
if v, ok := itenariesMap[i]; ok {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, utils.PrettyPrint(s.TravelItenariesCSV[v])) // this takes ~500.0µs
//fmt.Fprintf(w, utils.PrettyPrint(v)) // this takes ~50.0µs
}
defer utils.PrintExecutionTime(startTime)
做两件事:打印需要时间。对于一个变量,它将是x,它将相应地缩放为参数的10倍
Second:当测量吞吐量时,不要使用defer: defer将在稍后运行(因此使用术语defer)。
所以要衡量地图的性能,你可以这样做:
for _, v := range s.TravelItenariesCSV { //s.TravelItenariesCSV is a slice of the struct above
itenariesMap[v.FlightNum] = i
}
utils.PrintExecutionTime(startTime)
rest of the code
这应该给你一个更好的吞吐量估计