【问题标题】:Sorting C++ vector and C# List对 C++ 向量和 C# 列表进行排序
【发布时间】:2012-11-11 19:59:13
【问题描述】:

我决定在排序测试中比较速度 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,

【问题讨论】:

  • C++ 比 C# 快?这很奇怪......
  • 请出示您的实际完整代码。您是否也在测量 JIT 时间?
  • 问题是什么?
  • 我使用Guid.NewGuid().ToString() 生成了一个包含 270,000 个字符串的列表。在调试版本中,对它们进行排序平均需要 1.2 秒。您的结果似乎根本不准确。
  • @BenTrofatter 如果您不知道 JIT 是如何工作的,请不要发布任何有关 C# 的 cmets。谢谢。

标签: c# c++ list vector compare


【解决方案1】:

因为我喜欢把时间浪费在像这样毫无意义的事情上,这里是 我的 基准测试结果(使用相同的“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&lt;T&gt; 内部使用的数组的每次访问进行边界检查,而 C++ 没有这样做,或者可以更轻松地优化掉。

【讨论】:

  • 如果您愿意,甚至可以优化 3x:codeproject.com/Articles/146086/Fast-String-Sort-in-C-and-F 感谢您浪费您的时间,我只是在等待有人这样做。 :-)
  • 顺便说一句,您忘记调用 Sort 一次以避免测量 JIT 时间!
  • @FelixK。它没有明显的区别;我们说的是 270 万个字符串。不过,无论如何我都会包含它。结果是一样的。
  • 嗯,我刚刚复制了你的代码,我在 c# 上还有 25 秒,而在 c++ 上只有 0.7 秒。你可以试试我正在排序的同一个文件吗?文件链接:2shared.com/document/Cb4lFbCx/words-back.html
  • @Berserker 使用你的字符串,两者都有更好的时间:C++ 在 0.9 秒内完成,C# 在 8 秒内完成。它不像你的测试那么戏剧化,但你去吧。至于为什么 C# 更慢,我敢打赌这是由于访问 List 的内部数组的数百万次边界检查,以及 Array.Sort(由List.Sort) 调用来执行它的排序。知道使用哪些工具很重要;如果你真的需要这 7.1 秒,你需要 C++(或在 C# 中实现更好的排序)。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2018-07-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多