gpt4 book ai didi

c# - 排序 C++ vector 和 C# 列表

转载 作者:行者123 更新时间:2023-11-30 04:23:28 25 4
gpt4 key购买 nike

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

最佳答案

因为我喜欢把时间浪费在像这样毫无意义的事情上,这里是我的基准测试结果(使用相同的“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++ 不这样做,或者可以更容易地优化掉。

关于c# - 排序 C++ vector 和 C# 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13334883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com