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;
        }
    }

C#提高程序的效率

这是我查找的第一件事,也是我要更改的第一件事情:

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