GoLang – encoding/json.Marshal or fmt.sprintf?

huangapple go评论82阅读模式
英文:

GoLang - encoding/json.Marshal or fmt.sprintf?

问题

哪个更快?

data := fmt.Sprintf("{"TEST":3, "ID":"%s"}", Id)

还是将这样的结构体进行 JSON 编组?

英文:

Which would be faster?

data := fmt.Sprintf("{\"TEST\":3, \"ID\":\"%s\"}", Id)

OR json marshalling a struct like that?

答案1

得分: 6

在使用基本数据类型(字符串、布尔值、整数)的 JSON 时,fmt.Sprintf 的速度更快。基准测试显示,对于渲染一个非常小的 JSON 对象,fmt.Sprintf 的速度大约是 json.Marshal 的两倍,随着添加更多数据,性能差距会增大。

使用两种方法渲染 JSON 对象的基准测试结果如下(每种方法各执行 10,000,000 次以确保清晰):

渲染小型 JSON 对象的基准测试:
使用 json.Marshal 渲染 JSON 对象所需时间:8.747821898 秒
使用 fmt.Sprintf 渲染 JSON 对象所需时间:4.452937712 秒

渲染较大 JSON 对象的基准测试:
使用 json.Marshal 渲染 JSON 对象所需时间:32.100388801 秒
使用 fmt.Sprintf 渲染 JSON 对象所需时间:10.392861696 秒

请注意,如果你的 JSON 对象包含更复杂的数据类型,如列表和嵌套对象,则这些结果不适用。

英文:

In the case of JSON with basic data types (string, bool, int) fmt.Sprintf is faster. Benchmarking shows that it is on the order of twice as fast as json.Marshal for rendering a very small JSON object, with the spread in performance increasing as more data is added.

The benchmark results for rendering a JSON object using both methods (10,000,000 times each for clarity) are as follows:

Benchmarks for rendering a small JSON object
Time taken to render JSON object using json.Marshal:     8.747821898s
Time taken to render JSON object using fmt.Sprintf:      4.452937712s

Benchmarks for rendering a larger JSON object
Time taken to render JSON object using json.Marshal:     32.100388801s
Time taken to render JSON object using fmt.Sprintf:      10.392861696s

Note that these results do not hold if your JSON object contains more complex data types like lists and nested objects.

答案2

得分: 1

根据你要做的事情而定,你应该进行基准测试并查看结果。

然而,对于你提供的具体示例,最快的方法就是使用基本的字符串拼接,像这样:

data := `{"TEST":3, "ID":"` + Id + `"}`
英文:

Highly depends on what you're trying to do, you should benchmark it and see.

However for your very specific example, the fastest way is just use basic string concat like :

data := `{"TEST":3, "ID":"` + Id + `"}`

huangapple
  • 本文由 发表于 2015年1月31日 01:15:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/28241146.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定