我决定将速度c std ::向量与分类测试中的c#列表进行比较。因此,我用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字符串,
,因为我喜欢浪费时间在毫无意义两种语言都有270万个指导):
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 不使用,或更容易地优化。