25

Racketプログラムをコンパイルするかどうかは、実行時のパフォーマンスに影響を与えないようです。

コンパイルによって改善されるのは、最初にファイルをロードするだけですか?言い換えれば、実行中racket src.rktはその場でjitコンパイルを実行しますか?それが、コンパイルとインタラクティブの違いが見られない理由です。

整数演算のタイトなループの場合でも、多少の違いが生じると思っていましたが、以前にを実行したかどうかに関係なく、プロファイル時間は同等raco makeです。

私は何か簡単なものが欠けていますか?

PS、ソースファイル(.rkt)または.zoファイルに対してラケットを実行できることに気付きました。ラケット.zoは、ファイルに対応するものが見つかった場合に自動的に使用し.rktますか、それとも.zoファイルを明示的に使用する必要がありますか?いずれにせよ、それは私が見ているパフォーマンスの数値に違いはありません。

4

2 に答える 2

29

はい、あなたが正しい。

Racketは、コードを2段階でコンパイルします。最初にコードをバイトコード形式にコンパイルし、次に実行時にマシンコードに変換します。ファイルをコンパイルすると、基本的にバイトコードが作成され、後で再コンパイルする手間が省けます。これは通常、小さなコードでは多くの時間がかかるものではないため、ランタイムに目立った違いは見られません。極端な例として、コレクションツリー内のすべてのファイルを削除してDrRacketを起動できます。これには多く*.zoの時間がかかります。大量のコードがあるので、開始するのに時間がかかりますが、一度開始すると、ほぼ通常どおりに実行されます。([実行]をクリックすると、一部のファイルがリロードされて再コンパイルされるため、時間がかかります。)コードが大きい場合のもう1つの懸念は、コンパイルプロセスによってメモリ消費量が増える可能性があることですが、コードが小さい場合は問題になりません。 。

パフォーマンスを向上させるためのヒントについては、ガイドの「 Performace」の章も参照してください。

于 2012-04-13T05:03:28.153 に答える
14

Racketは、REPLでインタラクティブに実行されるか、コマンドラインから実行されるかに関係なく、常にコードをコンパイルします。これがそれを説明するガイドのセクションです。対話モードでは、コンパイラはすべての式/定義をメモリ内のバイトコードに変換し、それを実行します。それ以外の場合、コンパイラはバイトコードをzoファイルに出力します。

注:エリは私がしたのと同時に答えました。詳細については、彼の回答を参照してください。

于 2012-04-13T05:03:28.933 に答える