使用C#和Unity的字符串读取和解析性能 背景

使用C#和Unity的字符串读取和解析性能 背景,c#,unity3d,split,string-parsing,C#,Unity3d,Split,String Parsing,首先,我有一个文本文件(CSV),只有几列和数十万行。总文件大小为10MB。我将资源与Unity一起使用,以便将其作为文本加载 相关代码为: TextAsset txtData = Resources.Load("data.csv") as TextAsset; string txt = txtData.text; strReader = new StringReader(txt); string line0 = strReader.ReadLine(); 问题 研究发现,阅读加句法分析速度

首先,我有一个文本文件(CSV),只有几列和数十万行。总文件大小为10MB。我将资源与Unity一起使用,以便将其作为文本加载

相关代码为:

TextAsset txtData = Resources.Load("data.csv") as TextAsset;
string txt = txtData.text;
strReader = new StringReader(txt);
string line0 = strReader.ReadLine();

问题 研究发现,阅读加句法分析速度慢,影响了统一的视觉效果。所以我用日志文件来查看。我每500行计算一次时间。奇怪的是,最后一组需要12毫秒(500行),第二组需要20毫秒,第一组的时间线性增加到1.5-1.7秒

更多信息 当Unity以90 Hz的频率绘图时,我使用线程读取字符串并解析数据

问题: 我应该在哪里寻找问题?我使用Unity资源、字符串读取器、拆分、解析来浮动。原因在哪里?有没有改进的方法

随着时间的减少,它看起来很奇怪

更新
在我使用文件流阅读器之后,每组是2ms。所以这就是Unity TextAsset?

鉴于这种行为,它几乎就是读取Linux文本文件的C#bug


C#需要\r\n但Linux只有\r\n。然后,每一行读取都会遍历整个文件,发现它是Linux文件,并且解析行的时间将与剩余文件大小成比例

您的代码可以通过将其更改为
而((currentLine=strReader.ReadLine())!=null)
并避免剩余的最后一行检查来整理。另外,CSV文件中的典型行是什么样子的?如果它包含的文本比要提取的四列多得多,那么可能会导致大量不必要的字符串分配(
string.Split
不便宜)。考虑使用有限状态机解析器,只为相关列分配新的字符串。最后,不要做<代码> catch(异常)< /代码>,尤其不要吞下它们。您的代码在读取失败时可能会很慢,因为异常代价很高。使用
Single.TryParse
而不是
Convert.ToSingle
,这将在无法解析字符串值时不会引发异常。
currentLine =strReader.ReadLine();
while (true) {// if last line is nothing we quit
    var values = currentLine.Split(',');    
    try {
        float x = (float)Convert.ToSingle(values[colX]);
        float y = (float)Convert.ToSingle(values[colY]);
        float z = (float)Convert.ToSingle(values[colZ]);
        float w = (float)Convert.ToSingle(values[colSize]);
        runningList.Add(v1);
    }catch(Exceptoion e){
    }
    currentLine = strReader.ReadLine();
}