有没有办法<char> <char> 逐行而不是字符串将文本文件读入内存或跨度?



我正在寻找优化我的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#编译器中做的那样)。

最新更新