【发布时间】:2013-05-30 12:56:36
【问题描述】:
我正在 golang 中制作一个 url fetcher。我是 golang 的新手,之前不知道 interace{} 类型,因此在我的 args_hash{} 中使用map[string]string(传递参数的通用哈希到我的提取器,例如time,date,site-path 等)。不过后来知道了interface{}这个类型,把我的map改成了map[string]interface{}。
我的 fetcher 中的各种函数使用 args_hash{}。早些时候,我不得不使用strconv.Atoi() 和stuff 将应该是整数的参数(但由于map[string]string) 的限制作为字符串 传递)转换为整数。
例如
func my_def(args_hash{} map[string]string){
url_count := strconv.Atoi(args_hash["url_count"])
// ... use url count
.
.
// ......successful url count calculated
args_hash["success_url_count"] = strconv.Itoa(success_count)
}
我的方法之前多次这样做,并且在它们之间多次传递了这个修改后的args_hash{}。
但从现在开始我已经转向使用
args_hash map[string]interface{}
我不再这样做了。
使用map[string]string,获取 10 个特定 URL 所需的时间约为 23 秒,但使用 map[string]interface{},这已减少到近一半(大约 12-13 秒)。
这可能是什么原因?
【问题讨论】:
-
等待和下载 HTTP 响应是缓慢的部分。除非你在做一些愚蠢的事情,否则测量时间的变化就是因为这个。您使用的类型将是您最不关心的。此外,
string和interface{}不可互换,如“我应该使用哪一个”。strings 用于字符串,interface{}用于变量或未知类型。 -
我也认为等待 http 响应、写入数据库等应该花费大量时间。但我很确定,通过这一单一变化,时差是如此之大。我不知道为什么会这样?
-
好吧,我们需要看一些实际的代码来回答这个问题。这可能是从 Go 中的错误到出现严重错误的
time.Sleep()。