2

是否可以在不到 1 秒(1.000000)内加载 3 或 400 万行的文件?一行包含一个单词。单词的长度范围从 1 到 17(这有关系吗?)。

我的代码现在是:

List<string> LoadDictionary(string filename)
{
    List<string> wordsDictionary = new List<string>();

    Encoding enc = Encoding.GetEncoding(1250);//I need ę ą ć ł etc.
    using (StreamReader r = new StreamReader(filename, enc))
    {
        string line = "";
        while ((line = r.ReadLine()) != null)
        {
            if (line.Length > 2)
            {
                wordsDictionary.Add(line);
            }
        }
    }

    return wordsDictionary;
}

定时执行的结果:

加载 400 万字的时间 - 图片结果

如何强制该方法使其在一半时间内执行?

4

4 回答 4

5

如果你知道你的列表会很大,你应该设置一个好的起始容量。

List<string> wordsDictionary = new List<string>( 100000 );

如果您不这样做,列表将需要不断增加其容量,这需要一些时间。可能不会减少一半,但这是一个开始

于 2011-11-08T23:25:26.683 回答
4

File.ReadAllLines()一些 LINQ 的性能如何?

public List<string> LoadDictionary(string filename)
{
    List<string> wordsDictionary = new List<string>();
    Encoding enc = Encoding.GetEncoding(1250);
    string[] lines = File.ReadAllLines(filename,enc);
    wordsDictionary.AddRange(lines.Where(x => x.Length > 2));
    return wordsDictionary;
}
于 2011-11-09T00:35:52.473 回答
1

此时,您最大的性能损失可能只是将数据从硬盘驱动器提取到内存中。除非获得更好的硬件,否则您不可能做任何事情来让它运行得更快。

于 2011-11-08T23:26:40.957 回答
0

轮廓。轮廓。轮廓。

我们都可以猜测时间花在哪里,然后提出其他可能更快的方法。我们中的一些人甚至可能有很好的直觉,或者很幸运,偶然发现了正确的答案。但是测量、迭代和再次测量会更有效率。

Raymond Chen 做了一个有趣的系列,关于加载中文/英文词典并加快加载时间。它不完全一样(他做了字符转换和一些简单的解析,而且字典有点小)而且它是不同的语言。但是我还是推荐这个系列,因为它展示了优化这样的东西的正确方法:配置文件、配置文件、配置文件。

于 2011-11-09T16:56:27.670 回答