关于CPU缓存或GC或其他任何问题的不确定问题

时间:2017-07-23 03:38:24

标签: json memory go garbage-collection cpu

我为golang编写了一个任意的JSON解析器,项目差不多完成了。但我发现了一个关于性能的令人困惑的问题:

我想测试解析大(100Mb)JSON字符串的性能,我使用测试文件本身在内存中初始化JSON结构并将封送的JSON字符串写入文件,然后从中读取,如果文件已存在,不会在内存中初始化,只是直接从文件中读取。性能完全不同:直接从文件读取时要花费大约两倍的时间来解析。与此同时,我正在测试有关解析正常(1Kb)JSON字符串和深(2Mb)JSON字符串的性能,这两者几乎不受影响。

为什么呢?是CPU缓存?还是GC?或者其他什么?

https://github.com/acrazing/cheapjson处的代码,我在https://github.com/acrazing/cheapjson/issues/1打开了有关此问题的问题。您可以从此处获得有关基准的更多详细信息。

2 个答案:

答案 0 :(得分:0)

我无法重现您的问题:https://github.com/acrazing/cheapjson/issues/1。我的基准测试结果:

$ go version
go version devel +b817359 Sat Jul 22 01:29:58 2017 +0000 linux/amd64
$ rm -rf data
$ ls -la data
ls: cannot access 'data': No such file or directory
$ go test -v -run=! -bench=. -benchmem parser_test.go
2017/07/23 02:42:09 big input size: 117265882, normal input size: 763, deep input size: 2134832
goos: linux
goarch: amd64
BenchmarkUnmarshalBigInput-4               1    1107362634 ns/op    278192256 B/op   8280859 allocs/op
BenchmarkSimpleJsonBigInput-4              1    2680878194 ns/op    569595680 B/op   7575252 allocs/op
BenchmarkUnmarshalNormalInput-4       300000          5685 ns/op        4622 B/op        129 allocs/op
BenchmarkSimpleJsonNormalInput-4      200000          9565 ns/op        5602 B/op         87 allocs/op
BenchmarkUnmarshalDeepInput-4           1000       2085186 ns/op      372922 B/op       5134 allocs/op
BenchmarkSimpleJsonDeepInput-4           100      12311435 ns/op     8911102 B/op       6117 allocs/op
PASS
ok      command-line-arguments  15.067s
$ ls -la datatotal 116620
drwxr-xr-x 2 peter peter      4096 Jul 23 02:42 .
drwxr-xr-x 5 peter peter      4096 Jul 23 02:42 ..
-rwxr-xr-x 1 peter peter 117265882 Jul 23 02:42 big.json
-rwxr-xr-x 1 peter peter   2134832 Jul 23 02:42 deep.json
-rwxr-xr-x 1 peter peter       763 Jul 23 02:42 normal.json
$ go test -v -run=! -bench=. -benchmem parser_test.go
2017/07/23 02:42:31 big input size: 117265882, normal input size: 763, deep input size: 2134832
goos: linux
goarch: amd64
BenchmarkUnmarshalBigInput-4               1    1140498937 ns/op    278220704 B/op   8280995 allocs/op
BenchmarkSimpleJsonBigInput-4              1    2685285322 ns/op    569592608 B/op   7575242 allocs/op
BenchmarkUnmarshalNormalInput-4       300000          5685 ns/op        4622 B/op        129 allocs/op
BenchmarkSimpleJsonNormalInput-4      200000          9633 ns/op        5601 B/op         87 allocs/op
BenchmarkUnmarshalDeepInput-4           1000       2086891 ns/op      372927 B/op       5134 allocs/op
BenchmarkSimpleJsonDeepInput-4           100      12387413 ns/op     8911084 B/op       6117 allocs/op
PASS
ok      command-line-arguments  11.903s
$ ls -la data
total 116624
drwxr-xr-x 2 peter peter      4096 Jul 23 02:42 .
drwxr-xr-x 5 peter peter      4096 Jul 23 02:42 ..
-rwxr-xr-x 1 peter peter 117265882 Jul 23 02:42 big.json
-rwxr-xr-x 1 peter peter   2134832 Jul 23 02:42 deep.json
-rwxr-xr-x 1 peter peter       763 Jul 23 02:42 normal.json
$ 

我在四台不同的机器和两个操作系统上得到了类似的结果:三台Linux和一台Windows。

答案 1 :(得分:0)

这是旧的基准测试结果,时间是11:01

enter image description here

这是目前的最终测试结果,结果无法再现,这太棒了。

enter image description here