- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
转到标准库,Json 序列化性能问题...JSON 比 XML 和 GOB 慢,而 json 大小小于 xml 文件大小?
请帮忙指出有什么错误吗?
docker@dockhost:~/go/projects/wiki$ go run encoding.go
2016/05/24 00:52:16 Serialization by JSON elapsed: 2152195 us
2016/05/24 00:52:16 students.json 19177782
2016/05/24 00:52:17 Serialization by GOB elapsed: 748867 us
2016/05/24 00:52:17 students.gob 9305166
2016/05/24 00:52:18 Serialization by XML elapsed: 1507397 us
2016/05/24 00:52:18 students.xml 26177780
docker@dockhost:~/go/projects/wiki$ go run encoding.go
2016/05/24 00:52:32 Serialization by JSON elapsed: 1388153 us
2016/05/24 00:52:32 students.json 19177782
2016/05/24 00:52:33 Serialization by GOB elapsed: 502814 us
2016/05/24 00:52:33 students.gob 9305166
2016/05/24 00:52:34 Serialization by XML elapsed: 897859 us
2016/05/24 00:52:34 students.xml 26177780
docker@dockhost:~/go/projects/wiki$ go run encoding.go
2016/05/24 00:52:41 Serialization by JSON elapsed: 1290359 us
2016/05/24 00:52:41 students.json 19177782
2016/05/24 00:52:42 Serialization by GOB elapsed: 434203 us
2016/05/24 00:52:42 students.gob 9305166
2016/05/24 00:52:42 Serialization by XML elapsed: 862379 us
2016/05/24 00:52:42 students.xml 26177780
代码:
package main
import (
"log"
"encoding/json"
"encoding/gob"
"encoding/xml"
"math/rand"
"strconv"
"os"
"time"
)
const (
Male=iota
Female
Unknown
ALL=100000
)
type Person struct {
Name string
Id string
Age int
Gender int
}
type Student struct {
Person Person
Grade int
Class string
Teacher Person
}
func (s Student) String() string{
v,err:=json.Marshal(s)
if err!=nil {
log.Fatal("Marshal failed",s)
}
return string(v)
}
var students []Student
func init(){
students=make([]Student,ALL)
for i:=0;i<ALL;i++ {
students[i].Grade=rand.Intn(5)
students[i].Class=strconv.Itoa(students[i].Grade)+",class"+strconv.Itoa(rand.Intn(10))
students[i].Person.Name="Student "+strconv.Itoa(i)
students[i].Person.Id="11001234512345551"+strconv.Itoa(rand.Intn(10))
students[i].Person.Age=10+rand.Intn(10)
students[i].Person.Gender=rand.Intn(3)
students[i].Teacher.Id="22001154365151344"+strconv.Itoa(rand.Intn(10))
students[i].Teacher.Name="Teacher "+strconv.Itoa(i)
students[i].Teacher.Age=40+rand.Intn(10)
students[i].Teacher.Gender=rand.Intn(3)
}
}
func toJsonFile(){
f,err:=os.OpenFile("students.json",os.O_RDWR ,0600)
if err!=nil {
log.Fatal("Can't open students.json "+ err.Error())
}
defer f.Close()
en:=json.NewEncoder(f)
err=en.Encode(students)
if err!=nil {
log.Fatal(err)
}
}
func loadJsonFile(){
f,err:=os.Open("students.json")
if err!=nil {
log.Fatal(err)
}
defer f.Close()
dec:=json.NewDecoder(f)
ss:=make([]Student,ALL)
err=dec.Decode(&ss)
if err!=nil {
log.Fatal(err)
}
// log.Println(ss)
}
func toGobFile(){
f,err:=os.OpenFile("students.gob",os.O_RDWR ,0600)
if err!=nil {
log.Fatal("Can't open students.gob "+ err.Error())
}
defer f.Close()
en:=gob.NewEncoder(f)
err=en.Encode(students)
if err!=nil {
log.Fatal(err)
}
}
func loadGobFile(){
f,err:=os.Open("students.gob")
if err!=nil {
log.Fatal(err)
}
defer f.Close()
dec:=gob.NewDecoder(f)
ss:=make([]Student,ALL)
err=dec.Decode(&ss)
if err!=nil {
log.Fatal(err)
}
// log.Println(ss)
}
func toXmlFile(){
f,err:=os.OpenFile("students.xml",os.O_RDWR ,0600)
if err!=nil {
log.Fatal( err.Error())
}
defer f.Close()
en:=xml.NewEncoder(f)
err=en.Encode(students)
if err!=nil {
log.Fatal(err)
}
}
func loadXmlFile(){
f,err:=os.Open("students.xml")
if err!=nil {
log.Fatal(err)
}
defer f.Close()
dec:=xml.NewDecoder(f)
ss:=make([]Student,ALL)
err=dec.Decode(&ss)
if err!=nil {
log.Fatal(err)
}
// log.Println(ss)
}
func main(){
start:=time.Now()
toJsonFile()
loadJsonFile()
end:=time.Now()
log.Printf("Serialization by JSON elapsed: %d us",end.Sub(start)/1000)
fi,err:=os.Stat("students.json")
if err!=nil {
log.Fatal(err)
}
log.Println(fi.Name(), fi.Size())
start=time.Now()
toGobFile()
loadGobFile()
end=time.Now()
log.Printf("Serialization by GOB elapsed: %d us",end.Sub(start)/1000)
fi,err=os.Stat("students.gob")
if err!=nil {
log.Fatal(err)
}
log.Println(fi.Name(), fi.Size())
start=time.Now()
toXmlFile()
loadXmlFile()
end=time.Now()
log.Printf("Serialization by XML elapsed: %d us",end.Sub(start)/1000)
fi,err=os.Stat("students.xml")
if err!=nil {
log.Fatal(err)
}
log.Println(fi.Name(), fi.Size())
}
最佳答案
正如您报告的那样,您的基准测试具有很多运行间变异性。这使得很难对问题进行推理。我们真正想要的是一个始终给出相同结果的基准,无论我们在一天中的什么时间运行它。
我稍微修改了你的基准,以便更容易可靠地重现结果:1. 我将数据序列化到内存中(作为字节 slice []byte
),2. 我避免数据溢出处理器的缓存(即,使用少量数据)。
有一种在 Go 中编写基准测试的标准方法,以获得更多可重现的结果 (https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go),但在这种情况下,我认为没有必要。
在 https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/golang/serialization 查看我的代码
在我的测试服务器上(为测试配置的 Skylake 处理器,以 3.4 GHz 的平坦频率运行,go 1.7),我得到...
2016/12/22 09:55:54 JSON 序列化耗时:599 us
2016/12/22 09:55:54 序列化字节大小:18781
2016/12/22 09:55:54 GOB 序列化已用时:230 us
2016/12/22 09:55:54 序列化字节大小:9066
2016/12/22 09:55:54 XML 序列化已用:2404 us
2016/12/22 09:55:54 序列化字节大小:25780
正如您从我的结果中看到的那样,JSON 仅比 XML 大 (30%),而 GOB 小得多。这与您的结果一致。仍然与您的结果一致,GOB 比 XML 和 JSON 快得多。
但是,JSON 序列化比 XML 序列化快得多(快 4 倍)。 GOB 的速度是 JSON 的两倍。
您会在自己的硬件上得到不同的结果,但我怀疑您会得到相当一致的数字(运行间差异很小),尤其是当您禁用 CPU 功能(例如 TurboBoost)时。
如果我们实际序列化到磁盘或使用大块数据会发生什么?它不会改变性能排序,因为 GOB 更快更小,JSON 在数据大小和处理大小方面处于中间,而 XML 更臃肿且处理速度更慢。
所以我认为我们可以有把握地得出结论,我们有以下...
GOB 更小更快。
JSON 小而快。
XML 又大又慢。
关于performance - golang json/gob/xml 中的序列化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405162/
我正在使用“RPUSH”命令将我的对象推送到我的 redis 库中。 // object is of type interface var network bytes.Buffer gob.NewEn
这个问题在这里已经有了答案: Unable to decode gob data (1 个回答) 关闭 4 年前。 这是我的 Playground ,我正在尝试序列化结构列表并从文件中读回。 htt
在我的 Go 程序中,我用 gob 编码 []byte 数据 buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) //dat
我想开发一个 type data struct 来实现磁盘存储。我在将数据对象编码为字节时遇到了问题。对于编码,我想使用 encoding/gob 包。 package data import (
我正在尝试将结构保存到 gob,但文件缺少嵌套类型的值。我可以自己保存 Matrix 类型,但 Network 结构的 gob 数据不包括 Matrix 值。有没有办法将这个嵌套结构保存到 gob 中
我在我的代码中做这样的事情 test1 = make(map[string]interface{}) test2 = make(map[string]interface{}) test3 = make
我有一个正在编码的简单结构类型。但是,我在解码数据时犯了根本性的错误。每次我尝试对其进行解码时,都会出现 EOF panic 错误。 //将 map 编码为gob。将 gob 保存到磁盘。从磁盘读取
我最近重组了我的代码,现在 main 包下有两个包:chain 和 api。 在 chain 中,我定义了一些结构 SomeStruct1、SomeStruct2 和这些结构的接口(interface
我正在尝试实现一个基于接口(interface)的消息队列,其中将作业作为字节推送到 Redis 队列。但是我在尝试解码字节流时不断收到 EOF 错误。 https://play.golang.org
我正在尝试将 []byte 通过 chan 提供给 gob 解码器。它可以工作,但起初解码器会抛出一大堆 EOF 错误,然后停止。当它停止抛出错误时,程序的行为与我预期的完全一样,它解码 gob 并正
我有一个非常非常大的 map 阵列(不是 slice ),然后我试图对其进行编码。我真的需要避免复制数组,但我不知道该怎么做。 到目前为止,我有这个: func doSomething() { va
我正在尝试将 gob 编码的数据保存在磁盘上的一个文件中,作为一个简单的数据存储。但是,当我下次打开它时,gob 编码器会忽略文件中已有的任何数据,并在发送数据之前重新发送已发送格式的定义。看到 go
我遇到了 gob 协议(protocol)问题(或者可能是一般的网络问题,我的知识薄弱),我不明白为什么下面的代码不能正常工作。它只是一个维护开放 TCP 连接并通过它发送多个 gob 的简单示例。该
这似乎无法正常工作,我不确定自己做错了什么。我正在尝试将 map 转换为 gob,对二进制文件进行 gzip 压缩并将其保存到文件中,然后再读回。 type Object struct { mystr
我们能否期望两个 Go 对象 x, y 使得 x 等于 y(假设接口(interface)和映射没有技巧,只是结构和数组)gob_encode(x) 和 gob_encode(y) 的输出将始终是一样
我已经阅读了 ( gob) 的文档,但我遇到了一些问题: 现在我知道如何像这样编码结构和解码了: func main() { s1 := &S{ Field1: "Hello
当我尝试使用 gob 编码器将类型为 map[mapKey]string 的 map 保存到文件中时,它没有将字符串保存到文件中。 这里的mapKey是struct,map value是长json字符
我主要使用 Python,但也在玩 Go。我写了下面的代码来做一些在 python 中非常简单的事情,我希望它也可以在 Go 中完成。 package main import ( "bytes
我有一个包含未导出字段的结构,应该进行 gob 编码和解码。 说: type A struct { s int } func (a *A) Inc() { a.s++ } 显然,在这种
是否可以使用 Gob 编码将结构串联附加到同一文件中?它适用于写作,但是当我不止一次地使用解码器阅读时,我遇到了: extra data in buffer 所以我首先想知道这是否可行,或者我是否应该
我是一名优秀的程序员,十分优秀!