Parsing Haskell Thrift:优化从网络连接读取和解析二进制数据
这是我们的后续问题 因此,最近我决定玩节俭游戏,并注意到它几乎慢得让人望而却步,我偶然发现了上面提到的帖子,所以我决定深入研究:)最初的问题有一些关于改进海报代码的建议,但没有太多关于改进库代码的建议。我对Haskell没有太多的经验,但我想我会尝试一下 我获得了Thrift()的源代码,并在启用了评测的情况下重新构建了它,以便了解库的运行情况。。。一句话,很糟糕,但这可能太慷慨了。我决定只关注ping测试,因为这似乎是最大的问题。这是分析器的输出(添加了一些以成本为中心的内容来分解昂贵的方法) 首先,以下是我如何构建一切以获取时间(并添加了分析以获取以下数字):Parsing Haskell Thrift:优化从网络连接读取和解析二进制数据,parsing,haskell,optimization,thrift,binary-data,Parsing,Haskell,Optimization,Thrift,Binary Data,这是我们的后续问题 因此,最近我决定玩节俭游戏,并注意到它几乎慢得让人望而却步,我偶然发现了上面提到的帖子,所以我决定深入研究:)最初的问题有一些关于改进海报代码的建议,但没有太多关于改进库代码的建议。我对Haskell没有太多的经验,但我想我会尝试一下 我获得了Thrift()的源代码,并在启用了评测的情况下重新构建了它,以便了解库的运行情况。。。一句话,很糟糕,但这可能太慷慨了。我决定只关注ping测试,因为这似乎是最大的问题。这是分析器的输出(添加了一些以成本为中心的内容来分解昂贵的方法)
- GHC版本:7.8.4
- 节约版本:0.9.2(从GitHub repo克隆)
runghc Setup.lhs configure --user -O2 && runghc Setup.lhs build && runghc Setup.lhs install
主要建筑物:
ghc Main -O2
时代:
- 哈斯克尔:3960毫秒
- C++:5ms
Trift代码表现如此糟糕的根本原因是什么?更惯用、更有效的方法是什么?对于这个长期的问题,我只是想确保有足够的上下文,我真的很有兴趣为Haskell创建这样的库。thrift不是二进制协议吗?听起来很简单比如说,根据你使用的是严格的还是懒惰的bytestrings,你可以为谷物或二进制文件找一份工作。也就是说,试着将你的问题格式化,以使问题的本质(“节俭”表现如此糟糕的根本原因是什么,以及什么是更惯用和有效的方式来做[节俭兼容的网络消息传递]?)脱颖而出。此外,您可能会在其中一个项目上获得更多的讨论。您是否尝试过使用
传输。框装
?如果整个通信被缓冲,一次读取1个字节应该不会有太大问题。最后,我们接受修补程序:-)
COST CENTRE MODULE %time %alloc
SCC_readMessageBegin ItemStore 24.0 29.8
SCC_writeMessageBegin ItemStore 24.0 18.9
MAIN MAIN 20.0 2.7
SCC_THRIFT_parseBinaryValue_ver Thrift.Protocol.Binary 8.0 4.3
CAF GHC.Event.Thread 4.0 0.0
SCC_THRIFT_parseBinaryValue_s Thrift.Protocol.Binary 4.0 9.3
SCC_THRIFT_parseBinaryValue_decodeUtf8 Thrift.Protocol.Binary 4.0 1.5
proc_ ItemStore 4.0 1.9
read_Ping_args ItemStore 4.0 3.3
main Main 4.0 1.3
unstreamChunks/inner Data.Text.Internal.Lazy.Fusion 0.0 1.6
SCC_THRIFT_parseBinaryValue_sz Thrift.Protocol.Binary 0.0 5.0
process_ping ItemStore 0.0 2.1
write_Ping_result ItemStore 0.0 14.2
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 124 0 20.0 2.7 100.0 100.0
main Main 250 0 0.0 0.0 72.0 95.0
process ItemStore 251 1 0.0 0.8 72.0 94.9
SCC_readMessageEnd ItemStore 282 100 0.0 0.1 0.0 0.1
SCC_proc_ ItemStore 261 100 0.0 0.1 32.0 44.1
proc_ ItemStore 262 100 4.0 1.9 32.0 44.0
process_ping ItemStore 268 100 0.0 2.1 28.0 40.8
SCC_tFlush ItemStore 281 100 0.0 0.7 0.0 0.7
SCC_writeMessageEnd ItemStore 280 100 0.0 0.1 0.0 0.1
SCC_write_Ping_result ItemStore 277 100 0.0 0.0 0.0 14.2
write_Ping_result ItemStore 278 100 0.0 14.2 0.0 14.2
from_Ping_result ItemStore 279 100 0.0 0.0 0.0 0.0
SCC_writeMessageBegin ItemStore 273 100 24.0 18.9 24.0 20.2
unstreamChunks/outer Data.Text.Internal.Lazy.Fusion 274 100 0.0 0.1 0.0 1.3
unstreamChunks/inner Data.Text.Internal.Lazy.Fusion 275 400 0.0 0.8 0.0 1.2
unstreamChunks/resize Data.Text.Internal.Lazy.Fusion 276 100 0.0 0.4 0.0 0.4
SCC_Iface.ping ItemStore 271 100 0.0 0.0 0.0 0.1
ping Main 272 100 0.0 0.1 0.0 0.1
SCC_read_Ping_args ItemStore 269 100 0.0 0.1 4.0 3.3
read_Ping_args ItemStore 270 100 4.0 3.3 4.0 3.3
unstreamChunks/outer Data.Text.Internal.Lazy.Fusion 263 100 0.0 0.1 0.0 1.3
unstreamChunks/inner Data.Text.Internal.Lazy.Fusion 264 400 0.0 0.8 0.0 1.2
unstreamChunks/resize Data.Text.Internal.Lazy.Fusion 265 100 0.0 0.4 0.0 0.4
SCC_readMessageBegin ItemStore 252 1 24.0 29.8 40.0 49.9
SCC_THRIFT_parseBinaryValue_ver Thrift.Protocol.Binary 254 0 8.0 4.3 16.0 20.1
SCC_THRIFT_parseBinaryValue_s Thrift.Protocol.Binary 255 100 4.0 9.3 8.0 15.8
SCC_THRIFT_parseBinaryValue_decodeUtf8 Thrift.Protocol.Binary 260 0 4.0 1.5 4.0 1.5
SCC_THRIFT_parseBinaryValue_sz Thrift.Protocol.Binary 256 100 0.0 5.0 0.0 5.0
SCC_THRIFT_parseBinaryValue_decodeUtf8 Thrift.Protocol.Binary 259 100 0.0 0.0 0.0 0.0
SCC_THRIFT_parseBinaryValue_ver Thrift.Protocol.Binary 257 100 0.0 0.0 0.0 0.0