rustwarp比gofasthttp要快数倍
上周我发现了关于超性能的帖子。它表示rusttokiohyper性能高于gohttp。这是意料之中的,但有一条评论与fasthttp相比,其中rust的表现稍差。
我决定自己执行基准测试。使用以下命令在AWSr5n。8xlarge实例上执行所有基准测试:wrkt16c1000d120shttp:127。0。0。1:8080
gofasthttp代码:包主导入(github。comvalyalafasthttp)funcfastHTTPHandler(ctxfasthttp。RequestCtx){ctx。Success(applicationjson,〔〕byte(Welcome!))}funcmain(){将普通函数传递给fasthttpfasthttp。ListenAndServe(:8080,fastHTTPHandler)}
生锈扭曲代码:使用扭曲::过滤器;使用http::header::{HeaderValue,HeaderName};〔tokio::main〕asyncfnmain(){letjsonHeaderValue::fromstatic(applicationjson);让serverkeyHeaderName::fromstatic(server);让服务器HeaderValue::fromstatic(rusthttp);letrouteswarp::any()。map(Welcome!)。with(warp::reply::with::header(http::header::CONTENTTYPE,json))。with(warp::回复::with::header(serverkey,server));warp::serve(routes)。run((〔127,0,0,1〕,8080))。await;}
请注意,需要额外的标头来匹配fasthttp实现。
初始基准测试结果
去快速http:请求秒:1153173。95传输秒:146。27MB
生锈翘曲:请求秒:1044974。17传输秒:132。54MB
fasthttp比rust版本高出10左右!
优化rust版本
很少有已知的技巧可以使rust版本更好地工作。让我们一步一步地应用它们,看看我们能走多远。
启用LTO
LTO是一种链接时优化,可减少生成的二进制大小并提高性能。了解有关LTO的更多信息。请求秒:1099343。12传输秒:139。44MB
与初始版本相比,我们获得了5的收益。
使用Jemalloc
默认情况下,rust代码使用libc内存分配器,通常不建议将其用于高负载的关键应用程序。有很多替代分配器。根据我的经验,jemalloc在性能和内存利用率方面是最好的。了解有关使用jemalloc的更多信息。请求秒:1119851。69传输秒:142。04MB
与LTO版本相比,我们得到了1。8。
启用不稳定的管道
带有wrk的Benchmark是一个非常简单的HTTP1小明文测试。这种基准有一些细节。让我们unstablepipeline在warp实例上启用。请求秒:1163136。54传输秒:147。53MB
与LTOjemalloc版本相比,我们获得了额外的3。8。
太好了,在这一步我们已经超越了fasthttp!
修复一些tokio
让我们检查一下火焰图,看看运行代码是否有明显的无效性。我不会发布它,以免叙述过多。
引起我注意的特殊功能是wake0(见这里)。常量NUMWAKERS:使用大小32;让mutwakers:〔OptionWaker;NUMWAKERS〕默认::default();
该wakers数组是在每个函数调用上创建的,用于收集所有需要通知并实际通知它们的唤醒者。我开始使用这段代码,并意识到减少会NUMWAKERS提高性能!让我们在这里注意,它是一个数组(不是vec),它是在堆栈上分配的,所以不会发生分配。性能不足的原因是rust在初始化数组时,会将None值复制到数组的每个槽中。NUMWAKERS当增加时,这会导致减速。
让我们尝试使用相对较新的MaybeUnint结构来修复它。我们需要创建一个MaybeUnint::unint()。assumeinit()包含所有元素的数组MaybeUnint。在这里了解更多。请注意,我们不再需要Option了。请参阅PR与实现。请求秒:1196535。29传输秒:151。77MB
我们获得了额外的2。8,并且以3。7的成绩超过了gofasthttp!
什么做得不好
我尝试了更多技巧,但没有显示出有意义的影响:在http标头中使用aHash而不是FNV。虽然预计aHash的性能会优于FNV,但实际上我发现性能略有下降。尝试编译,RUSTFLAGS’Ctargetcpunative’但显示严重退化10减少SystemTime::now()hyper中的调用次数。Hyper需要生成Date标头。它使用优化以每秒一次以RFC7231格式呈现日期,但它仍然执行调用以检索每个HTTP调用的时间。我可以观察到大约0。6的时间花在clockgettime火焰图上。可能的优化是缓存时间并在每个线程停放在tokio中重置一次。有一个未解决的问题。我发现实现起来有点困难,所以我在hyper中注释掉了渲染的Date重新生成。它没有显示出任何稳定的改善。
iOS15。1Beta2发布解决2大问题今天凌晨,苹果向开发者推送了iOS15。1beta2更新,与上次更新时隔一周的时间。本次更新的版本号为:19B5052f,这次更新,主要解决2个问题:1,苹果……
或面临巨额罚款!传苹果(AAPL。US)因其NFC芯片面临欧智通财经APP获悉,据知情人士透露,苹果(AAPL。US)将因其NFC芯片技术而受到欧盟反垄断指控的打击,此举可能使该公司面临巨额罚款的风险,并可能迫使其对竞争对手开放移动支付……
被恶意开通苏宁易购免密支付的后续9月28日晚被盗刷后,担心银行账号泄露导致更多款项损失,所以当晚我在还没来得及思考问题发生根源情况下,把光大银行卡上的钱全部转到了工商银行,然后关闭了微信和支付宝与光大银行的账……
方舟子为什么会被别人骂的那么惨?方舟子作为中国科技界民间纪检组长。从美利坚留学归来,一出江湖,化无形之剑,专打名人公知,招招致其要害,使其求生不得,求死不能,身败名裂,贻笑天下!我发现方组长虽说功夫了得……
GovsJavavsC语法对比1。说明最近在学习Go,在学习的过程中为了加快学习速度、将新知识添加到已有知识体系架构中,总是会拿Go和其他开发语言进行对比,最终进行总结,于是就有了这篇文章。对于每一个……
对抗OpenSea?AndreCronje在Fantom发布Odaily星球日报译者余顺遂本月早些时候,前产品经理NateChastain被指控进行内幕交易,他知道哪些会出现在OpenSea的主页上,并涉嫌买卖这些NFT以赚取约6……
苹果首次在美国以外出售官翻版iPhone财经网科技9月22日讯,据IT之家援引9to5mac消息发现,苹果现已开始在加拿大在线商店出售官翻认证翻新版iPhone。自2016年开始,苹果就开始在美国在线商店出售官翻iP……
6个提效开发的JavaScript杀手函数1。校验一个元素是否在可视区域内网页开发时,常常需要了解某个元素是否进入了视口(viewport),即用户能不能看到它。可以使用IntersectionObserver这……
让人怀念的战斗机青春回忆杀这个是十八年前的事了,那时候手机刚刚普及。青春年少的我看见雨后春笋的手机特别羡慕人家。不过那时候手机真的比较贵的,用奢侈品来比喻都不为过,在乡镇大众价格一千多,……
安庆衡智能汽车芯片受制于人汽车产业急需跨界融合新京报贝壳财经讯(记者林子)2月25日,在中国电动汽车百人会论坛媒体沟通会上,中国汽车工业咨询委员会主任、北汽集团原董事长、中国电动汽车百人会理事安庆衡表示,智能汽车的发展仍然……
国产液晶电视哪个牌子好国产液晶电视机排名国产液晶电视哪个牌子好?目前市场上国产液晶电视机消费者比较信任的国产品牌有海信、创维、TCL、海尔、康佳等品牌,接下来就详细为大家介绍一下国产液晶电视机排名靠前的品牌吧(以下排……
微信及QQ承担政府部门日常的通知手段,如果腾讯封禁账号导致国没有责任。国家政务通知的渠道,是国家自有渠道,包括机要文件通知和内部电话网络通知等等。腾讯没有担负保障国家政务通讯渠道顺利的义务,国家也没有向腾讯购买此类服务。所以腾讯没有任何……