4

我正在尝试编写一个简单的词法分析器,它将打印其输入中的所有单词,其中一个单词是最大字母序列a-zA-Z。必须忽略所有其他字符。

我的 Alex 程序使用basic-bytestring包装器使用与输入大小一样多的内存。我原以为它会在恒定内存中运行。

使用的堆配置文件-hc仅显示单个固定内存块迅速上升到输入的大小,然后缓慢下降到 0。

有趣的是,当使用basic包装器和普通字符串时,只使用常量内存。

亚历克斯输入文件是

{
module Main where
import Data.ByteString.Lazy as B
}

%wrapper "basic-bytestring"

$letters = [a-zA-Z]
$nonletters = [~$letters\n]

tokens :-
  $nonletters+  ;
  $letters+     {B.copy}

{
main = do
  buf <- B.getContents
  let toks = alexScanTokens buf
  mapM_ B.putStrLn toks
}

当使用大小为 10M 的输入运行时,输出+RTS -s

   2,924,029,784 bytes allocated in the heap
       7,869,696 bytes copied during GC
       9,958,560 bytes maximum residency (5 sample(s))
       1,423,704 bytes maximum slop
              22 MB total memory in use (0 MB lost due to fragmentation)

                                    Tot time (elapsed)  Avg pause  Max pause
  Gen  0      5634 colls,     0 par    0.06s    0.05s     0.0000s    0.0002s
  Gen  1         5 colls,     0 par    0.00s    0.00s     0.0004s    0.0011s

  INIT    time    0.00s  (  0.00s elapsed)
  MUT     time    2.79s  (  2.81s elapsed)
  GC      time    0.06s  (  0.06s elapsed)
  EXIT    time    0.00s  (  0.00s elapsed)
  Total   time    2.85s  (  2.86s elapsed)

  %GC     time       2.0%  (1.9% elapsed)

  Alloc rate    1,047,072,808 bytes per MUT second

  Productivity  98.0% of total user, 97.6% of total elapsed

对于我哪里出错或如何进一步调查此问题,我将不胜感激。

4

0 回答 0