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