冗談じゃない。C#アプリケーションとC ++アプリケーションがあります。彼らはまったく同じことを、まったく同じ量のコードで行います...
...そして、C#のものは、高速であるだけでなく、10倍高速で実行されています。
これは奇妙なことに私を驚かせました。なぜなら、私はデバッガーでC#アプリを実行していたため、そもそもC#の速度が低下するはずだからです。次に、その理由から、C#は、多数の追加機能を備えたMSILにコンパイルされた.NETを使用した大きなオーバーヘッドを伴うバイトコードであるため、速度が低下するはずです。C ++は純粋なマシンコードですが。
C#コードは次のとおりです。
static void main()
{
ulong i = 0;
while (i < 100000000000)
{
Console.WriteLine(i);
i++;
}
}
これはC ++コードでしたが
int main()
{
usigned long i = 0;
while (i < 100000000000)
{
cout << i << endl;
i++;
}
return 0;
}
彼らはただ数を数えて表示しているだけです。C ++のものは1000になり、C#のものは7000になります。(7倍高速)
私はそれらの両方をコンパイルし、コマンドプロンプトでコマンドプロンプトを使用してデバッガなしで実行しようとしました:cplusplus.exe && csharp.exe
ええ、私は多分この質問が「オフトピック」であることを知っています:Pまたは多分それは「何が求められているのか明確ではない」です。:/しかし、誰かが私にこれを説明してください。
これが重要な場合、私はこのCPUを使用しています:Intel i72.5Ghz。
編集:私はcout << i << "\ n"; アイデアに加えて、std :: ios_base :: sync_with_stdio(false); 運や結果の変化なしにアイデア。
編集2:私はCのprintf()を試しましたが、はるかに高速でした。C#より3倍高速です。
IOストリームは非常に遅いと言われたので、コンソールに書き込まずに両方を試しましたが、C ++はC#よりもはるかに高速でした。
結論として、Writeline()はcoutよりもはるかに高速であり、printf()は両方よりもはるかに高速です。したがって、コンソールへの書き込みだけがコンソールの速度を低下させます。
TLDR:printf()が優先され、コンソールの書き込みが遅くなります。
あなたはあなたの評価に十分注意を払っていなかったと思います。以下に詳述するように、C ++でテストを再作成しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CSScratch
{
class Program
{
static void Main(string[] args)
{
ulong i = 0;
while (i < 1000000)
{
Console.WriteLine(i);
i++;
}
}
}
}
上記をVS2013リリースモードでCSScratch.exeにビルドし、ファイルシステムの書き込み時間がカウントされないように出力をリダイレクトして(cygwin bashで)時間を計測しました。結果はかなり一貫しており、5回の実行の中で最も速いものは次のとおりです。
time ./CSScratch.exe > NUL
real 0m17.175s
user 0m0.031s
sys 0m0.124s
C ++の同等物:
#include <iostream>
int main()
{
std::ios_base::sync_with_stdio(false);
unsigned long i = 0;
while (i < 1000000)
{
std::cout << i << '\n';
i++;
}
}
また、VS2013でコンパイルされています:
cl /EHsc /O2 output.cc
time ./output > NUL
5回の実行の中で最も遅いもの:
real 0m1.116s
user 0m0.000s
sys 0m0.109s
これは、C#の最速の実行(17.175秒)よりもさらに高速(1.116秒)です。
両方のバージョンの時間の一部は、ロード/ダイナミックリンク、初期化などにかかります。C++バージョンを10倍以上ループするように変更しましたが、それでも9.327秒しかかかりませんでした。これはC#がワークロードの10分の1に必要な時間の約半分です。
(より大きな出力バッファーを設定することでC ++バージョンをさらに調整できますが、通常は必要ありません)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加