我正在尝试编写一个简单的词法分析器,它将打印其输入中的所有单词,其中一个单词是最大字母序列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
对于我哪里出错或如何进一步调查此问题,我将不胜感激。