Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在“热身”之后解封JSON要快得多?

为什么在“热身”之后解封JSON要快得多?
EN

Stack Overflow用户
提问于 2018-08-23 08:44:34
回答 1查看 116关注 0票数 0

我注意到,当我在Go服务器的上下文中执行JSON解组时,即使对于小对象,也要花费30,000+纳秒时间。这对我来说似乎很大,所以我运行了一些独立的基准,令人惊讶的是,每个解组的平均时间是500 nanos。为了更深入地研究这一点,我编写了一个程序,它只在同一个小对象上执行一系列的解组操作,这表明第一个解编组是缓慢的,而后续的解组则要快得多:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "time"
    "fmt"
    "encoding/json"
)

var b []byte

type Dog struct {
    Age int `json:"Age"`
}

func unmarshalDog() {
    dogCopy := Dog{}

    start := time.Now().UnixNano()
    json.Unmarshal(b, &dogCopy)
    end := time.Now().UnixNano()
    fmt.Printf("Time to marshal/unmarshal: %d\n", end-start)
}

func main() {
    // Marshal an object into a byte array which we will repeatedly unmarshal from
    d := Dog {
        Age: 5,
    }

    var err error
    b, err = json.Marshal(d)
    if err != nil {
        panic(err)
    }

    for i := 0; i < 20; i++ {
        unmarshalDog()
    }

    // Allow the goroutines to finish before terminating execution.
    time.Sleep(3 * time.Second)
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ go run testJSONPerformance.go
Time to marshal/unmarshal: 34127
Time to marshal/unmarshal: 1465
Time to marshal/unmarshal: 979
Time to marshal/unmarshal: 892
Time to marshal/unmarshal: 849
Time to marshal/unmarshal: 814
Time to marshal/unmarshal: 822
Time to marshal/unmarshal: 822
Time to marshal/unmarshal: 815
Time to marshal/unmarshal: 829
Time to marshal/unmarshal: 822
Time to marshal/unmarshal: 819

更有趣的是,当我运行相同的程序,但通过unmarshalDog()在单独的go unmarshalDog()中运行每个调用时,热身现象消失了,平均解组时间要长得多:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Time to marshal/unmarshal: 36540
Time to marshal/unmarshal: 4652
Time to marshal/unmarshal: 56959
Time to marshal/unmarshal: 3887
Time to marshal/unmarshal: 57068
Time to marshal/unmarshal: 3519
Time to marshal/unmarshal: 37160

我还尝试了一个版本,在这个版本中,我没有对相同的字节数组进行解封,而是每次封送和解封一个不同的对象(以防出现某种运行时缓存)。这个案例的结果是一样的。

我很好奇这个明显的“热身”是怎么回事。在HTTP服务器的上下文中,每个请求都有一个不同的goroutine,因此每个解组的平均速度都很慢。考虑到Go显然有可能在某一特定情况下在1/50的时间内进行解组,这似乎不太理想。所有的直觉都被欣赏了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-24 05:31:13

JSON解组器缓存任何类型的第一个解封组的信息。类型的后续反封送处理使用此缓存信息。

缓存在大猩猩之间共享,但没有代码确保只有一个goroutine尝试创建第一个缓存值。一旦一个goroutine将一个值存储到缓存中,所有新的到达者都将使用该缓存的值。

缓存的代码是这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51990634

复制
相关文章
为什么在python中for-range比while运行的要快
time python test1.py 或者test2.py,得到第一个的时间大概是0m1.189s;第二个的时间是0m0.514s。while循环的时间大概是for-range的两倍。
生信编程日常
2020/04/01
1K0
[杂谈] 为什么卖产品的比做产品的挣得多
昨天有个同学提醒我曾经答应他一篇文章。翻开我记录的读者留言,发现我的确是在三周前记录了这么个写作线索。原文很长,就不在此粘贴,大意是他们公司里程序员的工作非常辛苦,项目组忙的时候加班很多;而公司的销售整天吊儿郎当的,奖金却很高,感觉自己的血汗都成了销售买房换车的垫脚石,很不公平。 于是今天我和做Business operation的朋友探讨了她们公司销售人员的收入组成,花点时间谈谈为什么卖产品的(销售)要比做产品的(研发)挣得多。 读过『黑客与画家』的同学应该对Graham提出的「财富守恒定律」有印象:「如
tyrchen
2018/03/28
7280
为什么SQL语句命中索引比不命中索引要快?
有位粉丝面试高开的时候被问到,为什么SQL语句命中索引比不命中索引要快?虽然自己也知道答案,但被问到的瞬间,就不知道如何组织语言了。今天,我给大家深度分析一下。
Tom弹架构
2022/09/22
6270
为什么SQL语句命中索引比不命中索引要快?
json解析介绍 为什么使用json
估计很多人看到json一定不会感到陌生,因为在与服务器交流时,json是使用的一种数据传递方式,json的字符串写成之后再进行存储起来,就是保存的对象。下面就来看看,关于json解析的介绍,以及为什么使用json吧。
用户8715145
2021/06/17
3.5K0
JavaScript基础学习--01热身
一、js大致思路: 1、完成静态HTML+CSS 2、过一遍整体的大致js思路 3、按照从上到下的,从有至无的顺序完成js编写(包括先写大致轮廓,再细化细节部分) 4、调试代码      二、要点:
用户1148399
2018/01/09
8790
BufferedReader比Scanner要快
BufferedReader是支持同步的,而Scanner不支持。BufferedReader的read函数都加了synchronized关键字 BufferedReader的缓冲区大小为8KB,Scanner的缓冲区大小为1KB
砖业洋__
2023/05/06
2850
BufferedReader比Scanner要快
FFmpeg解封装实验!
大家好,我是txp,好久没有写技术原创文章了,久等了,记得之前写的播放器学习文章后面也没有继续更了;主要原因这段时间一个是由于工作的原因,二来主要是最近利用空闲时间看完了今年的第四本非技术书籍,目前又买了几本新的非技术书籍学习!在书上看到学到的知识,目前我都在总结输出!一些学习经验和工作当中的经验,我会慢慢录制视频出来,视频比文字更加生动(ps:因为之前录制的视频,不知道如何添加字幕,所以现在知道了,做就要认真做,就要把一件事情做好!)
用户6280468
2022/03/21
6350
FFmpeg解封装实验!
youtube竟然解封了
作者:matrix 被围观: 8,335 次 发布时间:2013-02-11 分类:兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
1.4K0
youtube竟然解封了
云计算需要快速应对变化
云计算的广泛应用已经表明人们是否会接受不再是一个问题,而是如何更好地采用。为了跟上21世纪的发展步伐,企业需要仔细考虑如何最好地将云计算集成到其系统和供应链中。
静一
2019/07/04
5540
Redis 学习笔记 3.1 热身
这章介绍 Redis 的5种数据类型,每节都由“介绍”、“命令”、“实践”和“命令拾遗”四部分组成。这种学习思路很符合初学者上手。
twowinter
2020/04/17
2980
【Json】json在SpringBoot中的格式转换
fastjson深入理解 fastJson对于json格式字符串的解析主要用到了一下三个类:
瑞新
2020/12/07
6.5K0
【Json】json在SpringBoot中的格式转换
腾讯云解封25端口
在使用腾讯云的服务器的时候,有时候需要发送邮件,但是默认是不开放25端口的,需要去官网控制台手动解除,这里记录下方法。 首先在控制台右上角找到自己的名字,鼠标悬浮上边就可以看到一个25端口解封的入口
用户1188347
2018/02/27
23.6K0
腾讯云解封25端口
QQ永久冻结解封方法
说到QQ永久封禁,说多了都是泪呀!五年前在从王者峡谷出来后就再也登录不上了,多次在腾讯客服小程序上申诉,每次都是那吊样,同样的理由同样的话术,有人就说找人工客服啊,在理的人都知道,腾讯没有人工客服。不对!是钱冲到位了就有人工客服。
浩瀚博客
2022/08/15
6.5K0
QQ永久冻结解封方法
您厉害,您赚得多
前言 发文章的主要价值是为了证明自己有多牛,聊天的主要价值却在于发现自己有多傻 在投资方面,发现自己傻比证明自己牛的价值大10000倍! 找到好公司(靠长期积累的眼光);碰到合适的买入时机(靠运气和耐心);持有(靠对公司的理解和对市场波动的理解) 股价涨跌无法预测,投资者应该放弃赚市场钱的企图 ---- 第一章 认识市场 在股市上,整体而言,你可以做以下三件事情 琢磨别人 琢磨公司 琢磨自己 以我多年的『赌博』经验,琢磨2和3的人很多是赚钱的,琢磨1的人很少有赚钱的 你认为投资机会很少,那么你可能会赚得很多
yeedomliu
2021/01/28
3820
我们为什么推荐在Json中使用string表示Number属性值
在这篇简短的文章中,我将解释在使用JSON传输数据时,为什么浮点数或大十进制值应表示为字符串 。
有态度的马甲
2020/05/26
1K0
我们为什么推荐在Json中使用string表示Number属性值
开工之前的热身小菜(二)习题
accum("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
用户4945346
2020/06/16
2870
惊呆面试官!为什么SQL语句命中索引比不命中索引要快?
有位粉丝面试高开的时候被问到,为什么SQL语句命中索引比不命中索引要快?虽然自己也知道答案,但被问到的瞬间,就不知道如何组织语言了。今天,我给大家深度分析一下。
Tom弹架构
2023/09/07
2610
惊呆面试官!为什么SQL语句命中索引比不命中索引要快?
组件分享之后端组件——轻松构建RESTful JSON API的组件go-json-rest
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/05/13
6250
在 WordPress 中使用 JSON
在 PHP 5.2+ 的版本中使用 JSON 去解码数组是非常容易的事情,只需要使用 json_enconde() 这个 PHP 函数,但问题是 WordPress 到目前为止还是支持 PHP 4.3,所以为了保证插件最大的兼容性,在 WordPress 中使用 JSON 的时候,需要额外的第三方类库。
Denis
2023/04/14
5840
腾讯云解封25端口
在使用腾讯云的服务器的时候,有时候需要发送邮件,但是默认是不开放25端口的,需要去官网控制台手动解除,这里记录下方法。
主机优惠教程
2019/07/08
36.5K3
腾讯云解封25端口

相似问题

为什么Matlab在脚本“热身”之后运行得更快?

228

为什么列表理解比numpy要快得多?

13

为什么基于范围的查询要快得多?

12

为什么这个cpu的速度要快得多?

21

为什么切片比“手动”分配要快得多?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文