私はemacsはグローバル文字列キャッシュを使用していますか?
(eq "a" "a")
の結果はnil
あるので、答えはノーだと思います。つまり、文字列を保持する単一の定数シンボルを作成し、実際の文字列の代わりにシンボルを使用してすべてをバイトコンパイルするほうが速いでしょうか?私はこれを正しくテストする方法がわかりません。
私はemacsはグローバル文字列キャッシュを使用していますか?
(eq "a" "a")
の結果はnil
あるので、答えはノーだと思います。つまり、文字列を保持する単一の定数シンボルを作成し、実際の文字列の代わりにシンボルを使用してすべてをバイトコンパイルするほうが速いでしょうか?私はこれを正しくテストする方法がわかりません。
elisp リーダーは、文字列リテラルを読み取るたびに新しいオブジェクトを作成します。
読者は、(eq "a" "a")
を、後で評価するために3つのオブジェクトのリストに変換します。すなわち、内部記号eq
と2つの文字列オブジェクトです。
2つの文字列オブジェクトは同等の値を持つため、equal
とstring-equal
です。しかし、それらは異なるオブジェクトなので、それらはeq
ではありません。
読者は、あなたが書いたテキストを(繰り返し)評価できるlispオブジェクトに変換します。つまり、あなたが書いたテキストは直接評価されず、リーダが何を生産するかを管理するルールがあります。文字列リテラルは独立したオブジェクトとして読み込まれ、等しい整数は同じオブジェクトとして読み込まれます。これは評価フェーズに影響します。 ReadフェーズとEvaluateフェーズの区別を理解することなく、Lispの特定の側面は非常に混乱することがあります。 (http://emacs.stackexchange.com/q/20535は良い例です) – phils
バイトコンパイルに関する専門家はいませんが、バイトコンパイルされたコードはまだ理解しています。コンパイルされていないコードと同じ読み込みプロセス(または少なくとも* a *読み込みプロセス)。コンパイルされたフォームは確かに実行中に効率的ですが、その動作がコンパイルされていないフォームと同等でない場合、それは大きな問題になるので、私はそれがあなたが考えるかもしれない灰色の領域ではないと思います。 – phils
あなたの質問の一部:はい、文字列(記号に名前を付ける文字列を含む)よりも(eqを使用して)記号を比較する方が速いです。 – Drew
ええ、間違っています。文字列はEmacs Lispでは高価です。シンボルとバッファは高価ではありません。また、必要な場合は、シンボルセットと名前空間である独自のオブジェクトを作成することができます。 – Drew