1

我决定在排序测试中将速度 C++ std::vector 与 C# List 进行比较。所以我用 2 700 000 个相同的字符串填充它们并测量排序时间。

它看起来像这样:

C++:

std::vector<std::string> CPPList;
std::ifstream file("words-back.txt");

std::string word;
while(std::getline(file, word))
{
    CPPList.push_back(word);
}

file.close();

Profiler profiler;
profiler.Start();

std::sort(CPPList.begin(),CPPList.end ());

profiler.Stop();

C#:

string[] lista = File.ReadAllLines("words-back.txt").ToArray();

List<string> CSList = new List<string>();
foreach (string element in lista)
{
    CSList.Add(element);
}

Stopwatch timer = Stopwatch.StartNew();
    CSList.Sort( );
timer.Stop();

结果让我大吃一惊,以至于我不得不问你发生了什么事。C++ 需要 0.7 秒,而 C# 需要 25 秒。我确实输出了带有排序字符串的文件,以确保排序正确完成并且是正确的。

我的问题是:为什么 C# 比 C++ 长这么多。

对不起,在我吃一个零之前,这个文件中的字符串不是 270 000 而是 2 700 000,

4

1 回答 1

2

因为我喜欢把时间浪费在这样毫无意义的事情上,所以这是的基准测试结果(使用相同的“guids.txt”,大小约为 100mb,两种语言都有 270 万个 GUID):

使用 C#:

static void Main(string[] args)
{
    int numStrings = 2700000;
    List<string> strings = new List<string>(numStrings);

    // pre-jit the generic type
    new List<string>(new[] { "str1", "str2" }).Sort();

    using (var fs = File.Open("C:\\guids.txt", FileMode.Open))
    using (var r = new StreamReader(fs))
    {
        Console.WriteLine("Loading strings...");
        string str;
        while ((str = r.ReadLine()) != null)
        {
            strings.Add(str);
        }
    }

    Console.WriteLine("Beginning sort...");

    var sw = Stopwatch.StartNew();
    strings.Sort();
    sw.Stop();

    Console.WriteLine(sw.Elapsed.TotalSeconds + " seconds, or " + sw.Elapsed.TotalMilliseconds + " milliseconds");
}

在发布版本中,我得到了大约 15 秒。

在 C++ 中:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Loading strings..." << endl;

    int numStrings = 2700000;
    vector<string> vec;
    vec.reserve(numStrings);

    ifstream file("C:\\guids.txt");

    string line;
    while (getline(file, line))
    {
        vec.push_back(line);
    }

    cout << "Starting sort..." << endl;

    unsigned start = clock();
    sort(vec.begin(), vec.end());
    unsigned ms = clock() - start;

    int seconds = ms / 1000;

    cout << "Result: " << seconds << " seconds, or" << endl << ms << " milliseconds" << endl;

    return 0;
}

我得到了大约 5 秒。

所以 C++ 大约快 3 倍。C# 速度慢的原因可能是对内部使用的数组的每次访问进行边界检查List<T>,而 C++ 不这样做,或者可以更轻松地优化掉。

于 2012-11-11T21:50:09.567 回答