2

私はc++の初心者なので、何か間違ったことをしている可能性がありますが、とにかくc ++ dllを作成し、wpfプロジェクトから呼び出します。

c ++コード:

extern "C" __declspec (dllexport) double writeTxt()
{   
    ofstream mf("c:\\cpp.txt");     
    for(int i=0;i<999;i++)
    {
     mf<<"xLine: \n";
    }
    mf.close();
    return 1;

}

C#からコードを呼び出す:

[DllImport(@"C:\Users\neo\Documents\visual studio 2010\Projects\TestDll\Debug\TestDll.dll",
       CallingConvention = CallingConvention.Cdecl)]
    public static extern double writeTxt();

今、私は実行時間をこのc#関数と比較しようとしています:

double writeTxtCs()
    {
        StreamWriter sw = new StreamWriter(@"c:\cs.txt");
        for (int i = 0; i < 999; i++)
        {
            sw.WriteLine("Line: " + i);
        }
        sw.Close();
        return 0;
    }

ただし、c#関数はc++関数の約2倍の速度です。
このようにテストされました:

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        long[] arr = new long[100];
        Stopwatch sw = new Stopwatch();
        for (int i = 0; i < 99; i++)
        {
            sw.Start();
            //double xxx = writeTxt();
            double xxx = writeTxtCs();
            arr[i] = sw.ElapsedMilliseconds;
            sw.Reset();
        }
        MessageBox.Show(arr.Average().ToString());
        Close();
    }

c#関数を実行すると、通常は〜0.65msになり、c ++関数を実行すると、〜1.1msになります。
私の質問は:私は何か間違ったことをしているのですか、それともこのシナリオではc#はc ++よりも本当に速いのですか?

4

4 に答える 4

4

C++ と C# をテストしていません。[C++ とライブラリ] と [C# とライブラリ] をテストしています。

ofstream が StreamWriter よりも遅い理由を見つけるには、コードをプロファイリングするか、内部を調べる必要があります。

とにかく、1 ミリ秒はコンピューターにとって非常に短い時間です。タイミングのジッターを無関係にするために、1000 倍の負荷でテストを繰り返します。

于 2012-06-19T21:32:07.930 に答える
4

他のすべての回答には有効なポイントがあります。それらに加えて:

C++ DLL の「デバッグ」ビルドに対してテストを行っていますが、C# のパフォーマンスに与える影響よりも C++ のパフォーマンスを低下させている可能性があります。両方で最適化を解き放ち、それがどのように機能するかを確認してください。

それにもかかわらず、I/O は「言語」とはあまり関係がありません。それはランタイムとOSに関するものです。

于 2012-06-19T21:42:11.613 に答える
2

これはバッファリングの問題である可能性があります。つまり、C# および C++ ファイルの書き込みガッツが異なる方法でデータをバッファリングしている可能性があり、パフォーマンスの違いが生じる可能性があります。

IO バウンド (ハード ドライブへの書き込みなど) ではなく、純粋に CPU バウンドの操作をベンチマークに使用することをお勧めします。たとえば、各関数が 0 から MAX_INT までカウントできる速度を確認します。

于 2012-06-19T21:33:07.650 に答える
2

それは本当に信頼できるベンチマークではありません。そこでファイル IO を実行していますが、これは ofstream と StreamWriter の実装に大きく依存しています。また、それは問題ですか?

于 2012-06-19T21:34:24.533 に答える