なぜ C はそれほど速く、他の言語はなぜそれほど速くないのでしょうか?

C について特別なことはあまりありません。それが C が速い理由の 1 つです。

ガベージ コレクション、動的型付け、およびプログラマがプログラムを簡単に記述できるようにするその他の機能をサポートする新しい言語。

問題は、アプリケーションのパフォーマンスを低下させる追加の処理オーバーヘッドがあることです。 C にはそれがないため、オーバーヘッドがないことを意味しますが、プログラマはメモリを割り当てて解放し、メモリ リークを防ぐ必要があり、変数の静的型付けを処理する必要があります。

とはいえ、Java (Java Virtual Machine を使用) や .NET (Common Language Runtime を使用) などの多くの言語やプラットフォームは、ネイティブ マシン コードを生成するジャスト イン タイム コンパイルなどの出現により、長年にわたってパフォーマンスを向上させてきました。より高いパフォーマンスを実現するためのバイトコード。


C 設計者が行ったトレードオフがあります。つまり、安全よりもスピードを優先する決断を下したということです。 Cはしません

  • 配列インデックスの境界を確認する
  • 初期化されていない変数値をチェック
  • メモリリークをチェック
  • null ポインターの逆参照を確認する

配列にインデックスを付ける場合、Java では、仮想マシンでのメソッド呼び出し、境界チェック、およびその他の健全性チェックが必要です。それは有効であり、まったく問題ありません 、それは当然のことながら安全性を追加するからです。しかし、C では、かなり些細なことでさえ安全に置かれません。たとえば、C では、コピーする領域が重複しているかどうかを確認するために memcpy は必要ありません。 違う 大規模なビジネス アプリケーションをプログラミングするための言語として設計されています。

しかし、これらの設計上の決定は C 言語のバグではありません .コンパイラとライブラリの作成者がコンピューターからあらゆるパフォーマンスを引き出すことができるため、これらは設計によるものです。 C Rationale ドキュメントで説明されている C の精神は次のとおりです。


C で 0.05 秒で実行される何かを作成するのに 1 か月を費やし、私が Java で同じことを 1 日書いて 0.10 秒で実行されるとしたら、C の方が本当に速いでしょうか?

しかし、あなたの質問に答えるために、よく書かれています 一般に、C コードは他の言語で適切に作成されたコードよりも高速に実行されます。これは、C コードを「適切に」作成することには、マシンに近いレベルで手動で最適化を行うことが含まれるためです。

コンパイラは確かに非常に賢いですが、手でマッサージされたアルゴリズムと競合するコードを創造的に思いつくことはまだできていません (「手」が良い C プログラマ)。

編集:

多くのコメントは、「私は C で書いており、最適化については考えていません。」

しかし、この投稿から特定の例を挙げると:

Delphi では、次のように記述できます。

function RemoveAllAFromB(a, b: string): string;
var
  before, after :string;
begin
  Result := b;
  if 0 < Pos(a,b) then begin
    before := Copy(b,1,Pos(a,b)-Length(a));
    after := Copy(b,Pos(a,b)+Length(a),Length(b));
    Result := before + after;
    Result := RemoveAllAFromB(a,Result);  //recursive
  end;
end;

C では次のように書きます:

char *s1, *s2, *result; /* original strings and the result string */
int len1, len2; /* lengths of the strings */
for (i = 0; i < len1; i++) {
   for (j = 0; j < len2; j++) {
     if (s1[i] == s2[j]) {
       break;
     }
   }
   if (j == len2) {  /* s1[i] is not found in s2 */
     *result = s1[i]; 
     result++; /* assuming your result array is long enough */
   }
}

しかし、C バージョンにはいくつの最適化があるでしょうか?私たちは、Delphi バージョンでは考えていない実装に関する多くの決定を行います。文字列はどのように実装されますか? Delphi では表示されません。 C では、文字と呼ばれる ASCII 整数の配列へのポインターになると決めました。 C では、文字の存在を一度に 1 つずつテストします。 Delphi では、Pos を使用します。

そして、これはほんの一例です。大規模なプログラムでは、C プログラマーは数行のコードごとにこの種の低レベルの決定を行う必要があります。手作業で最適化された実行可能ファイルになります。