Julia中两次调用HTTP/JSON相关函数性能差异且编译占比低的原因
Julia非编译类HTTP/JSON调用二次性能差异成因
这类编译占比极低的重复调用性能差异,均属于运行时IO、缓存类开销带来的差距,和Julia JIT预编译机制无关,具体成因如下:
- HTTP连接复用收益:首次调用
HTTP.request的GET/POST方法时,需要完成TCP三次握手、HTTPS场景下的TLS证书校验与密钥协商、HTTP会话初始化全流程;HTTP.jl默认开启HTTP/1.1 keep-alive机制,二次调用同域名接口时会直接复用已建立的持久连接,省去了连接建立的全部开销,这部分是性能差异的最主要来源。 - 系统级网络缓存生效:首次请求后,目标域名的DNS解析结果会被本地DNS服务、操作系统内核缓存,同时TCP连接的慢启动阈值也会在首次数据传输后完成适配,后续同目标的网络传输包丢失率、传输效率都会明显优化。
- JSON解析内部缓存收益:
JSON.parse(String(r.body))执行时,会对首次解析遇到的字符串编码规则、高频出现的JSON字段名做内部缓存,二次调用时如果解析的JSON结构相似,不需要重复做编码合法性校验、字段名哈希预计算,也会带来可观测的性能提升。 - 堆内存复用收益:首次调用相关函数时需要申请新的堆内存空间存储请求体、响应体、解析结果,二次调用时会优先复用之前已经申请、且被垃圾回收机制标记为可用的内存块,省去了新内存申请、页表映射的系统开销。
内容的提问来源于stack exchange,提问作者cactus
相关产品推荐
相关产品推荐

