none
关于 StringReader.ReadLine 的性能讨论 RRS feed

  • 常规讨论

  • 通常用于遍历文本中的每一行,我会用到 System.IO.StringReader 类的 ReaderLine 方法,但是为了更高效的编写代码,我为 string 类编写了一个扩展方法 EachLine, 代码如下:

    public static IEnumerable<string> EachLines(this string str)
    {
        char[] chars = str.ToCharArray();
        int b = 0;
    
        for (int i = 0; i < chars.Length - 2; i++)
        {
            if (chars[i] == '\r' || chars[i + 1] == '\n')
            {
                yield return new string(chars, b, i - b);
                b = i + 2;
            }
        }
    }

    当需要遍历文本中的每一行时,只需要像下面这样调用:

    foreach(string line in str.EachLines())
    {
    }

    比起 StringReader 使用时需要用 using(...) 包含,还需要 while() 循环判断是否读完,这样写似乎方便多了。

    我用 Stopwatch 观察了一下两种方法分别对相同的文本运行的时间,StringReader 几乎完胜自己写的扩展方法,代码运行时间快了十来倍。看了 StringReader 的源码后,其原理和我的扩展方法基本上相同,这就想不通了,为什么它的运行速度会更快呢?

    虽然两者在处理普通文本的运行时间几乎在不到一毫秒左右,不影响实际应用,但还是想搞清楚为什么自己的扩展方法会没有它的高效?


    Promise you do it!

    2014年4月12日 5:01

全部回复