C#提高程序的效率
本文关键字:效率 程序 高程序 | 更新日期: 2023-09-27 18:08:21
我正在开发一个C#程序,该程序读取非常大的文件,并检查它们的不同属性和字段。我一直在用不到100万行的文件进行测试,它正在按预期进行预成型。我最近在一个有250万行的文件上测试了它,运行了4个小时。
我使用自定义的Reading函数来读取每个字符,这样我就可以找到所有的CR和LF,因为每一行都包含它们是非常重要的。我单独测试了Reading功能,读取文件大约需要14分钟,我觉得这足够合理,可以读取250万行1500个字符中的每个字符。我将加入我的阅读功能,但这似乎并不是问题的根源。
我的reading函数将每个字符添加到一个字符串中,然后检查字符串中的不同值。例如,is行长度是否正确,文件是否包含标头,以及标头是否包含正确的值。以及特定值,如字符位置403-404是一个数字,字段1250-1300不是空的,等等。
我的问题是,我该怎么做才能弄清楚是什么导致了程序的速度减慢并提高了效率?我试着检查了每一行循环开始和结束的时间,但似乎没有改变。然而,每10万人所花费的时间要比以前长得多。例如,10000至20000条生产线的处理时间不到3秒,830000至840000条生产线大约需要35秒。我曾考虑过尝试多个线程,但认为这对我从文件中读取行没有帮助。想法?谢谢你的帮助!
static void ReadMyLine(ref string currentLine, string filePath, ref int asciiValue, ref Boolean isMissingCR, ref Boolean isMissingLF, ref Boolean isReversed, ref StreamReader file)
{
Boolean endOfRow = false;
isMissingCR = false;
isMissingLF = false;
isReversed = false;
currentLine = "";
while (endOfRow == false)
{
asciiValue = file.Read();
if (asciiValue == 10 || asciiValue == 13)
{
int asciiValueTemp = file.Peek();
if (asciiValue == 13 && asciiValueTemp == 10)
{
endOfRow = true;
asciiValue = file.Read();
}
else if (asciiValue == 10 && asciiValueTemp == 13) // CRLF Reversed
{
asciiValue = file.Read();
endOfRow = true;
isReversed = true;
}
else if (asciiValue == 10) // Missing CR
{
isMissingCR = true;
endOfRow = true;
}
else if (asciiValue == 13) // Missing LF
{
isMissingLF = true;
endOfRow = true;
}
else
endOfRow = true;
}
else if (asciiValue != -1)
currentLine += char.ConvertFromUtf32(asciiValue);
else
endOfRow = true;
}
}
这是我查找的第一件事,也是我要更改的第一件事情:
currentLine += char.ConvertFromUtf32(asciiValue);
不要那样做。在循环中使用字符串串联可以降低性能-您可以获得O(N2(的复杂性。请改用StringBuilder
。请参阅我关于何时使用StringBuilder
的文章以获得更多解释。
你可能还可以做更多的事情,但仅仅改变为使用StringBuilder
就会有一个巨大的改进:
StringBuilder builder = new StringBuilder();
while (...)
{
...
builder.Append(char.ConvertFromUtf32(asciiValue));
}
currentLine = builder.ToString();
也不清楚为什么有这么多ref参数。你为什么要通过asciiValue
?你为什么要通过StreamReader
考试?任何使用这么多ref参数的事情都会让我非常紧张-为什么你没有一个类型来封装你真正想从方法返回的所有东西?
您可能想阅读我关于参数传递的文章,以更好地了解ref
。