使用 C# 和 Unity 的字符串读取和解析性能
String read and parsing performance with C# and Unity
背景
首先,我有一个包含几列和数十万行的文本文件 (CSV)。文件总大小为 10MB。我在 Unity 中使用了资源,因此它加载为 Text
相关代码为:
TextAsset txtData = Resources.Load("data.csv") as TextAsset;
string txt = txtData.text;
strReader = new StringReader(txt);
string line0 = strReader.ReadLine();
.....
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();
}
问题
发现读取加解析速度慢,影响Unity视觉效果。所以我用日志文件看。我计算每 500 行的时间。奇怪的是,最后一组耗时 12 毫秒(500 行),倒数第二组耗时 20 毫秒,第一组时间线性增加到 1.5-1.7 秒。
更多信息
当 Unity 以 90 Hz 绘制时,我正在使用线程读取字符串并解析数据。
问题
我应该去哪里找问题?我用Unity资源,字符串reader,拆分,解析为float。请问是什么原因,有什么办法可以改善吗?
随着时间的减少看起来很奇怪
更新
我使用文件流后reader,每组2ms。所以是Unity TextAsset?
鉴于行为,这几乎是读取 Linux 文本文件的 C# 错误。
C# 期望 \r\n 但 Linux 只有 \n。那么合理的是,每一行读取都会遍历整个文件,发现它是Linux个文件,解析行的时间将与剩余文件大小成正比
背景
首先,我有一个包含几列和数十万行的文本文件 (CSV)。文件总大小为 10MB。我在 Unity 中使用了资源,因此它加载为 Text
相关代码为:
TextAsset txtData = Resources.Load("data.csv") as TextAsset;
string txt = txtData.text;
strReader = new StringReader(txt);
string line0 = strReader.ReadLine();
.....
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();
}
问题
发现读取加解析速度慢,影响Unity视觉效果。所以我用日志文件看。我计算每 500 行的时间。奇怪的是,最后一组耗时 12 毫秒(500 行),倒数第二组耗时 20 毫秒,第一组时间线性增加到 1.5-1.7 秒。
更多信息
当 Unity 以 90 Hz 绘制时,我正在使用线程读取字符串并解析数据。
问题
我应该去哪里找问题?我用Unity资源,字符串reader,拆分,解析为float。请问是什么原因,有什么办法可以改善吗?
随着时间的减少看起来很奇怪
更新
我使用文件流后reader,每组2ms。所以是Unity TextAsset?
鉴于行为,这几乎是读取 Linux 文本文件的 C# 错误。
C# 期望 \r\n 但 Linux 只有 \n。那么合理的是,每一行读取都会遍历整个文件,发现它是Linux个文件,解析行的时间将与剩余文件大小成正比