英文:
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 + `"}`
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论