gpt4 book ai didi

json - 在 Go 中加速 JSON 解析

转载 作者:IT王子 更新时间:2023-10-29 01:51:17 26 4
gpt4 key购买 nike

我们有事务日志文件,其中每个事务都是 JSON 格式的一行。我们经常需要选取部分数据,进行一次时间转换,然后将结果以特定格式输入另一个系统。我编写了一个 Python 脚本来根据需要执行此操作,但我希望 Go 会更快,并给我一个开始学习 Go 的机会。所以,我写了以下内容:

package main
import "encoding/json"
import "fmt"
import "time"
import "bufio"
import "os"

func main() {

sep := ","

reader := bufio.NewReader(os.Stdin)

for {
data, _ := reader.ReadString('\n')
byt := []byte(data)

var dat map[string]interface{}

if err := json.Unmarshal(byt, &dat); err != nil {
break
}

status := dat["status"].(string)
a_status := dat["a_status"].(string)
method := dat["method"].(string)
path := dat["path"].(string)
element_uid := dat["element_uid"].(string)
time_local := dat["time_local"].(string)
etime, _ := time.Parse("[02/Jan/2006:15:04:05 -0700]", time_local)
fmt.Print(status, sep, a_status, sep, method, sep, path, sep, element_uid, sep, etime.Unix(), "\n")
}
}

编译毫无怨言,但我对缺乏性能改进感到惊讶。为了进行测试,我将 2,000,000 行日志放入 tmpfs(以确保磁盘 I/O 不会成为限制)并比较脚本的两个版本。我的结果:

$ time cat /mnt/ramdisk/logfile | ./stdin_conv > /dev/null 
real 0m51.995s

$ time cat /mnt/ramdisk/logfile | ./stdin_conv.py > /dev/null
real 0m52.471s

$ time cat /mnt/ramdisk/logfile > /dev/null
real 0m0.149s

如何让它更快?我做了一些初步的努力。例如,ffjson 项目建议创建不需要反射的静态函数;但是,到目前为止,我未能使其正常工作,出现错误:

Error: Go Run Failed for: /tmp/ffjson-inception810284909.go
STDOUT:

STDERR:
/tmp/ffjson-inception810284909.go:9:2: import "json_parse" is a program, not an importable package

:

此外,我上面的内容不会被认为是静态类型的吗?可能不是——我肯定是在关注围棋。我曾尝试有选择地禁用 Go 代码中的不同属性,以查看是否有一个特别有问题。没有一个对性能有明显的影响。关于提高性能的任何建议,或者这仅仅是编译语言与其他语言相比没有实质性优势的情况?

最佳答案

尝试使用类型来移除所有这些不必要的赋值和类型断言;

type RenameMe struct {
Status string `json:"status"`
Astatus string `json:"a_status"`
Method string `json:"method"`
Path string `json:"path"`
ElementUid string `json:"element_uid"`
TimeLocal time.Time `json:"time_local"`
Etime time.Time // deal with this after the fact
}

data := &RenameMe{}
if err := json.Unmarshal(byt, data); err != nil {
break
}

data.Etime, _ := time.Parse("[02/Jan/2006:15:04:05 -0700]", time_local)

我不打算对此进行测试以确保它优于您的代码,但我敢打赌它确实有很大优势。试一试,请告诉我。

关于json - 在 Go 中加速 JSON 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com