4

私は、C ++とC#の速度の違いは、主にC#がJITコンパイラーによって取り込まれるバイトコードにコンパイルされること(それは正しいですか?)とC#が行うすべてのチェックについて考えていました。

unsafeコンパイルオプションと、安全でないコードを共通言語ランタイムで検証できないためにキーワードを使用することの両方で、これらの関数の多くをオフにすることが可能であることに気付きました。

したがって、両方の言語で単純なコンソールアプリケーションを作成し、それが架空のコインを無限に反転させ、10,000回程度の反復ごとに結果を画面に表示した場合、速度の違いはどのくらいになるでしょうか。とてもシンプルなプログラムなので、これを選びました。

これをテストしたいのですが、C ++がわからないか、コンパイルするためのツールがありません。これは私のC#バージョンです:

static void Main(string[] args)
{
    unsafe
    {
        Random rnd = new Random();
        int heads = 0, tails = 0;
        while (true)
        {
            if (rnd.NextDouble() > 0.5)
                heads++;
            else
                tails++;

            if ((heads + tails) % 1000000 == 0)
                Console.WriteLine("Heads: {0}  Tails:  {1}", heads, tails);
        }
    }
}

コードのセクションを意図的に「安全でない」コンパイルしたり、オーバーフローチェックなどのコンパイルオプションの一部が有効になっていないDLLにコンパイルしたりするのに十分な違いはありますか?それとも、C ++でセクションをコンパイルすることが有益であるという逆の方向に進みますか?その時も相互運用速度が関係してくると思います。

主観を避けるために、私はこの質問の特定の部分を次のように繰り返します。

  • C#には、安全でないコードを使用することでパフォーマンスが向上しますか?
  • オーバーフローチェックを無効にするなどのコンパイルオプションはパフォーマンスを向上させ、安全でないコードに影響を与えますか?
  • 上記のプログラムはC++で高速ですか、それとも無視できるほど異なりますか?
  • C ++などの言語で長時間集中的な数値計算タスクをコンパイルしたり、ボーナスとして/ unsafeを使用したりする価値はありますか?主観的ではありませんが、これを行うことで集中的な操作をより速く完了することができますか?
4

2 に答える 2

2

与えられた例は、両方のプログラミング言語の実際の使用法を示していないため、欠陥があります。単純なデータ型を使用して言語の速度を測定しても、興味深いことは何ももたらされません。代わりに、C ++でテンプレートクラスを作成し、それをクラスジェネリックのC#で可能なものと比較することをお勧めします。結局、オブジェクトはいくつかの重要な結果をもたらし、C ++はC#よりも高速であることがわかります。言うまでもなく、低レベルのプログラミング言語をC#と比較しています。

C#には、安全でないコードを使用することでパフォーマンスが向上しますか?

はい、それは後押しされますが、安全でないコードのみを書くことはお勧めできません。その理由は次のとおりです。安全でないコンテキストを使用して記述されたコードは安全であると検証できないため、コードが完全に信頼されている場合にのみ実行されます。つまり、信頼できない環境で安全でないコードを実行することはできません。たとえば、安全でないコードをインターネットから直接実行することはできません。http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

上記のプログラムはC++で高速ですか、それとも無視できるほど異なりますか?

はい、プログラムはC++でわずかに高速になります。C ++は低水準のプログラミング言語であり、アルゴリズムライブラリの使用を開始するとさらに高速になります(random_shuffleが思い浮かびます)。

C ++などの言語で長時間集中的な数値計算タスクをコンパイルしたり、ボーナスとして/ unsafeを使用したりする価値はありますか?主観的ではありませんが、これを行うことで集中的な操作をより速く完了することができますか?

プロジェクトによって異なります...

于 2010-04-20T11:48:22.200 に答える
1

速度の100%以上まで-タスクに大きく依存します、と簡単に言います。

100%以上-はい、ジャストインタイムコンパイラがプロセッサを認識しているためです。実際にハードウェアプラットフォーム用に最適化することはできないでしょう;)

行列演算を行う場合、SSEは問題になりません。

大量の配列を使用する場合(画像操作)配列テストはあなたを殺しますが、ポインターはこれをバイパスするので機能します(つまり安全でないコード)。

オーバーフローチェックなどについては注意が必要です。のように:C++ではおそらく同じです。オーバーフローチェックが必要な場合、パフォーマンスの問題はありません;)

私は個人的にほとんどの場合C++を気にしません。部分的にはい、特にSSEの恩恵を受けることができる場合:

したがって、最終的には、計算する場合は自然に大きく依存します。

于 2010-04-20T11:34:25.903 に答える