排序C 向量和C#列表



我决定将速度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 不使用,或更容易地优化。

相关内容

  • 没有找到相关文章

最新更新