当前位置: 代码迷 >> 综合 >> 性能调优之三十六计 —— 「取而代之」Echo/Json 篇
  详细解决方案

性能调优之三十六计 —— 「取而代之」Echo/Json 篇

热度:119   发布时间:2023-09-21 04:22:55.0

文章目录

  • 性能调优之三十六计 —— 「取而代之」Echo/Json 篇
    • Echo 高性能、极简框架
      • C.JSON
      • Json-iterator
    • Q&A
    • 附录

性能调优之三十六计 —— 「取而代之」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、实际生产环境,做这个替换的不多吧?是否真的有必要呢?

视情况而定吧,服务对性能要求高的可以进行改造,竭尽所有压缩平响应,提升性能。

附录

架构图有抽象,更要清晰,主次调理,意示于人。

  相关解决方案