性能调优之三十六计 —— 「取而代之」Echo/Json 篇
Posted 魏小言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能调优之三十六计 —— 「取而代之」Echo/Json 篇相关的知识,希望对你有一定的参考价值。
性能调优之三十六计 —— 「取而代之」Echo/Json 篇
性能调优是每一个程序员进阶的毕竟之路,掌握各种调优技巧,对自身实力、价值的提升至关重要!
了解 Go 的同学知道,Echo 是一款极易上手且广泛被使用或被使用「在其基础上进行改造」的高性能、极简风格的框架。
在丰富的实际生产经历中,你会发现 Echo 没有想象中的那么棒,也有拉垮的时候。这时候就是体现调优价值的时候,这里针对原生 Echo 框架 Cue 一个小的调优技巧。
Echo 高性能、极简框架
Echo 官方是这样介绍的:
High performance, extensible, minimalist Go web framework。
高性能、可扩展、极简的 Web 框架,可谓是定位颇高。那么它的性能是真的高吗?
C.JSON
这个要看应用场景,如果我们约定交互方式为 JSON ,那么在 Web 服务进行响应时,通常会使用
c.JSON() 。官方给的示例为:
// User
type User struct {
Name string `json:"name" xml:"name"`
Email string `json:"email" xml:"email"`
}
// Handler
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "jon@labstack.com",
}
return c.JSON(http.StatusOK, u)
}
使用时候,通过性能工具就会发现,JSON 往往会占用服务耗时很高。性能为什么没有预期的高呢?
原因是 c.JSON 内部使用 json.Marshal 对大型 JSON 效率不高。官方在这种情况下,提供了 Stream JSON ,意味着直接进行流式传输。
那么问题可来了,流式传输需要传入 reader 对象,依据 type 进行交互,之前的约束就得作废重定。
Json-iterator
不过没关系,我们可以采用另外的方式调整这个问题,调优秘诀就是 Json-iterator !
Json-iterator ,是一款号称世界最快的、灵活的 JSON 解析器,提供 Java 和 Go 两个版本。
「注:在数据跑分上,其性能缺失遥遥领先 Go 内置 JSON 解析器,具体原理这里不做重点。」
我们把 c.JSON 内置用来 Go 结构体转换为 JSON 的原生包替换成 Json-iterator ,取而代之。
附上代码如下:
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
c.Response().WriteHeader(http.StatusOK)
return jsoniter.NewEncoder(c.Response()).Encode(resp)
十分简单,据优化数据观察,替换后性能较前可提高 8%。
「注:提供数据与测试数据类型耦合,仅做参考」
Q&A
1、实际生产环境,做这个替换的不多吧?是否真的有必要呢?
视情况而定吧,服务对性能要求高的可以进行改造,竭尽所有压缩平响应,提升性能。
附录
架构图有抽象,更要清晰,主次调理,意示于人。
以上是关于性能调优之三十六计 —— 「取而代之」Echo/Json 篇的主要内容,如果未能解决你的问题,请参考以下文章