C - コンパイラの最適化を使用すると、非常に高速なコードが生成されます。非常に時間が重要な割り込み用に、優れた C コンパイラによって作成された最適化後のアセンブラ コードがあります。コンパイラが知らない制約 (たとえば、入力値が常に特定の範囲内にあるなど) を知っている場合でも、コードを 25% 高速化することができます。ただし、Scheme コンパイラも認識しません!!
これは理論的には、C コンパイラによって生成されるコードよりも 1.3 倍高速なコードを記述できることを意味します。しかし、これ以上コードを高速化することはできませんでした。
もう 1 つの非常に高速な言語は Pascal であるため、最新の Pascal バリアント (FreePascal など) は、C コンパイラと同じ実行時間とメモリ消費量を持つ可能性があります。
スキームは宣言型プログラミング言語であり、C は命令型プログラミング言語です。簡単な質問は次のとおりです。「直接同等」とはどういう意味ですか?
次のスキーム コードについて考えてみましょう。
(define (example a) (+ (if (> a 1) (example (- a 1)) 0) (somefunc a)))
C では、次のように実装できます。
double iffunc(int a,double b,double c)
{
return a?b:c;
}
double example(int a)
{
return iffunc(a>1,example(a-1),0)+somefunc(a);
}
ただし、次のように実装することもできます。
double example(int a)
{
int i;
double b;
for(i=1;i<=a;i++) b+=somefunc(i);
return b;
}
C では、2 番目の実装は、すべてのプログラマーの 99% が使用する実装になります。最初のものよりもはるかに高速です。最初の実装は、Scheme バリアントと「直接同等」です。(Scheme で "for" ループを書くことは不可能です!!)
したがって、最初の実装の速度を Scheme コードの速度と比較すると、実際には 1.5 倍、またはそれ以上の速度になる可能性があります。2 番目の実装の速度を、Scheme コンパイラによって生成されたコードと比較すると、C コンパイラの方が確実に高速になります。