我正在寻找优化我的COBOL预处理器的方法,我们正在使用File.ReadLines()
读取每个源文件,虽然这目前确实有效,但由于预处理阶段的所有字符串分配和字符串操作,它也不是很有效。
我们必须根据free/fixed指令删除一行的前0-7个字符,根据某些指令清除或插入某些行,并且在预处理后删除指令,并且使用字符串列表执行所有这些操作结果非常昂贵。
既然span应该更有效,是否有一种方法将源文本逐行读取为Span<char>
或Memory<char>
?
到目前为止,我们已经尝试了File.ReadLines()
和File.ReadAllLines()
,但是当有很多源行时,这些内存效率太低,而且我们找不到从文本文件返回Span<char>
或Memory<char>
的方法。
span只是一种通用的、轻量级的读/写一堆值的方式,但是这些值必须存在于内存中的某个地方,以便您首先在它们上面初始化span。换句话说,span不能代替从文件中读取行。
现在,跨度的支持不一定是字符串,如果你解析非常大的文件,你可能不应该首先使用流,这就是MemoryMappedFile
存在的原因。在它上面创建一个视图访问器给你一个跨度它是由OS虚拟内存管理器支持的。在它上面编写你自己的解析,它就像在c++中使用指针一样高效。这应该是微不足道的,任何高中生都可以增加指针,直到它到达一个空格,然后对解析的值做一些事情。
字符串操作
考虑到你对跨度这样基本的东西的误解,如果我是你,我会非常担心的。如果操作不当,字符串操作很容易杀死应用程序。如果你没有粘贴任何代码,你可能甚至不知道有好方法和坏方法,从字面上的string
操作(重新分配和复制数据)到StringBuilder
,再到stackalloc
字节的零分配操作(就像ValueStringBuilder
在c#编译器中做的那样)。