2012-11-11 51 views
1

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

它看起来像这样:

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字符串在这个文件中,

+2

C++比C#更快吗?这很奇怪... –

+4

请显示您的实际**完整**代码。你是否也在测量JIT时间? – SLaks

+5

虽然问题是什么? – Arun

回答

2

因为我爱浪费我在这样毫无意义的事情的时候,这里是基准测试结果(使用在100MB左右270万点的GUID两种语言)称在同一个“guids.txt”:

用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#缓慢的原因可能是由于对内部使用的数组的每次访问都进行了边界检查,而C++没有这样做,或者可以更轻松地进行优化。

+0

甚至3x可以优化,如果你想要:http://www.codeproject.com/Articles/146086/Fast-String-Sort-in-C-and-F谢谢你浪费你的时间,我只是等待有人这样做。:-) –

+0

顺便说一句,你忘了调用一次排序,以避免测量JIT时间! –

+0

@FelixK。它没有任何可察觉的差异;我们正在谈论270万个字符串。无论如何,我会加入它的。结果是相同的。 – Siege