Haskell Alex:basic bytestring lexer泄漏内存
我正在尝试编写一个简单的lexer,它将打印输入中的所有单词,其中一个单词是字母的最大序列Haskell Alex:basic bytestring lexer泄漏内存,haskell,alex,Haskell,Alex,我正在尝试编写一个简单的lexer,它将打印输入中的所有单词,其中一个单词是字母的最大序列a-zA-Z。必须忽略所有其他字符 我的Alex程序使用了basic bytestring包装器,它使用了与输入大小相同的内存。我希望它能在恒定的内存中运行 使用-hc的堆配置文件仅显示一个固定内存块,该内存块快速上升到输入大小,然后缓慢下降到0 有趣的是,当使用basic包装器和普通字符串时,只使用常量内存 Alex输入文件是 { module Main where import Data.ByteStr
a-zA-Z
。必须忽略所有其他字符
我的Alex程序使用了basic bytestring
包装器,它使用了与输入大小相同的内存。我希望它能在恒定的内存中运行
使用-hc
的堆配置文件仅显示一个固定内存块,该内存块快速上升到输入大小,然后缓慢下降到0
有趣的是,当使用basic
包装器和普通字符串时,只使用常量内存
Alex输入文件是
{
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
}
我将非常感谢您对我的错误所在或如何进一步调查此问题的帮助。我还在项目存储库中创建了一个问题,因为我认为这是由于alex本身的一个缺陷造成的:
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