1

並べ替えテストで 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++ よりもずっと長くするのかということです。

申し訳ありませんが、ゼロを 1 つ食べる前は、このファイルでは 270 000 ではなく 2 700 000 文字列でした。

4

1 に答える 1

2

このような無意味なことに時間を浪費するのが大好きなのでベンチマークの結果を次に示します(両方の言語で約100 MB、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#が遅い理由は、おそらくList<T>、C ++が実行しない、またはより簡単に最適化できる、内部で使用する配列へのすべてのアクセスの境界チェックによるものです。

于 2012-11-11T21:50:09.567 に答える