【问题标题】:Is map[string]interface{} faster that map[string]string in golang? or are "strconv" functions too slow?map[string]interface{} 比 golang 中的 map[string]string 更快吗?还是“strconv”功能太慢?
【发布时间】: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 响应是缓慢的部分。除非你在做一些愚蠢的事情,否则测量时间的变化就是因为这个。您使用的类型将是您最不关心的。此外,stringinterface{} 不可互换,如“我应该使用哪一个”。 strings 用于字符串,interface{} 用于变量或未知类型。
  • 我也认为等待 http 响应、写入数据库等应该花费大量时间。但我很确定,通过这一单一变化,时差是如此之大。我不知道为什么会这样?
  • 好吧,我们需要看一些实际的代码来回答这个问题。这可能是从 Go 中的错误到出现严重错误的 time.Sleep()

标签: map interface go


【解决方案1】:

我怀疑你可能来自一种动态语言——比如JavaScriptPerl——它们缺乏对“结构”的支持(例如,在C 语言的意义上),所以你正在尝试使用映射(你称之为“哈希”)而不是 Go struct,并传递指向结构实例的指针。

所以我会像这样重写你的代码:

type FetcherArgs struct {
    OkUrlCount int
    UrlCount int
    FooBar string
    // ... and so on
}

func my_def(args *FetcherArgs) {
    args.OkUrlCount += 1
    // ...
    fmt.Printf("%v\n", args.UrlCount)
    // ...
}

var args = FetchArgs{UrlCount: 42, FooBar: "Life, the Universe and Everything"}
my_def(&args)

【讨论】:

  • 非常感谢返工,它确实让我对事物有了新的认识。但我想我会坚持使用地图。我主要使用“C”和“python”,并认为 maps/hash 在这里会是一个更好的选择,因为它们很容易使用,而且我可以随时随地动态地向它们添加字段。(AFAIK 这可以'没有完成一个结构?如果可以,请告诉我。我将不胜感激。)
  • @nomad,最后一个问题——不,你不能。至于您的其他观点,我真的不明白它们如何使事情变得更容易:每当您向地图添加新对时,您都必须修改 使用 新密钥及其代码的其他代码位价值。现在尝试解释这与向结构中添加另一个字段有何不同——您只需添加一行源代码吗?但是你会得到类型检查作为回报。我认为这比您想象中的编辑节省要好得多。
  • @nomad,IOW,当它们包含的对具有 uniform, 的属性时,地图真的很有用,而且这显然不像你的情况,因为你正在有效地做代码中基于键的硬编码类型切换。
  • 好的,如果你强烈坚持,我会试试的。谢谢。顺便说一句,这会让事情变得更快吗?我的意思是传递结构指针而不是映射,前者更快吗?
  • @sje397,此外,映射的感知灵活性(它允许迭代其所有元素)可以在 Go 中通过反射来补偿——例如,Go 将任意结构的实例序列化到JSON 或 XML,然后返回。
猜你喜欢
  • 2015-01-14
  • 2012-05-17
  • 2021-01-02
  • 2013-12-18
  • 2016-02-27
  • 2016-08-06
  • 2021-05-26
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多