Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing Haskell Thrift:优化从网络连接读取和解析二进制数据_Parsing_Haskell_Optimization_Thrift_Binary Data - Fatal编程技术网

Parsing Haskell Thrift:优化从网络连接读取和解析二进制数据

Parsing Haskell Thrift:优化从网络连接读取和解析二进制数据,parsing,haskell,optimization,thrift,binary-data,Parsing,Haskell,Optimization,Thrift,Binary Data,这是我们的后续问题 因此,最近我决定玩节俭游戏,并注意到它几乎慢得让人望而却步,我偶然发现了上面提到的帖子,所以我决定深入研究:)最初的问题有一些关于改进海报代码的建议,但没有太多关于改进库代码的建议。我对Haskell没有太多的经验,但我想我会尝试一下 我获得了Thrift()的源代码,并在启用了评测的情况下重新构建了它,以便了解库的运行情况。。。一句话,很糟糕,但这可能太慷慨了。我决定只关注ping测试,因为这似乎是最大的问题。这是分析器的输出(添加了一些以成本为中心的内容来分解昂贵的方法)

这是我们的后续问题

因此,最近我决定玩节俭游戏,并注意到它几乎慢得让人望而却步,我偶然发现了上面提到的帖子,所以我决定深入研究:)最初的问题有一些关于改进海报代码的建议,但没有太多关于改进库代码的建议。我对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
。。。哎哟:(

这是分析器的输出(添加了一些以成本为中心的内容来分解昂贵的方法)

Yikes.您会看到最大的违规者(readMessageBegin(包含SCC_THRIFT_parseBinaryVal_XYZ)和writeMessageBegin)占总时间的64%。这些方法所做的只是读取2个整数和一个字符串!。这显然是不可接受的

如果您查看Thrift/Protocol.hs()和Thrift/Protocol/Binary.hs( blob/master/lib/hs/src/Thrift/Protocol/Binary.hs)您会注意到他们正在使用Attoparsec解析二进制头,该头由version::Int32、一个字符串和消息大小::Int32组成

首先,这很奇怪(是吗?)使用Attoparsec读取您已经知道其确切结构的数据。其次,在Protocol.hs中,runParser每次从正在使用的任何传输协议中读取1个字节!!,并使用Attoparsec的部分功能并不断重新应用解析器。此外,它们似乎正在从惰性ByteString变为一个严格的ByteString然后在每次解析时返回到一个懒惰的ByteString。这些都不是有效的

我试图做一些修改,比如一次读取超过1个字节(但这只是导致它挂起),使用tReadAll(来自Transport.hs)从句柄读取整个内容,但也挂起。我还尝试了其他一些事情(比如直接使用Data.Binary),最终导致抛出异常“没有更多的数据可读”和其他类似的事情


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