使用C#和Unity的字符串读取和解析性能 背景
首先,我有一个文本文件(CSV),只有几列和数十万行。总文件大小为10MB。我将资源与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(); 问题 研究发现,阅读加句法分析速度
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();
}