単体テスト用の最小限のEmacs 25を構築する


10

Emacs Lispパッケージのユニットテスト用に、Emacsトランクの最小限のバリアントを構築したいと思います。ビルドにはGUIやイメージのサポートなどは必要ありません。本質的には、コアEmacs Lispライブラリを備えた最小限のEmacs Lispインタープリターでなければならず、理想的には5分未満で高速にビルドする必要があります。

現在、私はに渡し--with-x-toolkit=no --without-x --without-allてい./configureます。完了後、Emacsのすべての機能が無効になっていることがわかりますが、残念ながらビルドにはまだ10分近くかかります。

Emacsのビルドを速くすることは不可能かもしれないことは理解していますが、まったく同じフラグを使用すると、Emacs 24.5はわずか2分でビルドできるのではないかと思います。

この大きな違いの理由は何ですか?EmacsトランクをEmacs 24.5と同じ速さでビルドできますか?

また、関連する質問で、Emacsを静かにビルドする方法を教えてください。現在、私のユニットテスト出力のほぼ80%はEmacsビルドです。理想的には、make install出力をまったく出力しないようにしたいです。


ある種のCIプラットフォームでこれを行うことを計画していますか?そうでない場合、どのようなコンピュータを使用していますか?ビルド速度は明らかにプロセッサに依存しますが、私にとって./configure --with... && make -j (number of cores * 1.5)は30秒で終了します。ローカルマシンで実行している場合は、必ず-j引数を使用してください。あなたがする正当な理由はありますmake installか?これは、srcディレクトリからemacsを実行するだけで回避できる少しの時間を追加します。
Jordon Biondo、2015

それはトラビスCIですが、なぜそれが重要なのかわかりませんか?私が説明したいのは、同じマシン内の2つの異なるEmacsバージョン間の大きな違いです。IOWなぜ同じシステムで5倍長くトランクを構築するのですか?
lunaryorn 2015

リポジトリからビルドするには、すでに配布されているtarballに存在する特定のファイルを作成する必要があります。
politza

@politzaどのファイル?を./autogen.sh生成するために実行する必要があることはわかっていますconfigureが、それは数分ではなく数秒です。
lunaryorn

2
@lunaryom ここには3つの個別の質問があります。1:emacsを高速に構築する方法、2:emacs 25がemacs 24.5よりも遅い理由と3:make installサイレントで実行する方法 したがって、これらを3つの質問に分割して個別に追跡できるようにし、これを編集して1つの質問に固執してください。
岩だらけの

回答:


8

24.5がすぐにビルドされる理由は、.elcファイルが実際にtarballで配布されるためです。make -distを参照してください。gitからビルドする場合、ほとんどの時間は.elファイルをにコンパイルするのに費やされ.elcます。Cコードを最適化することで、Lispのコンパイルは速くなりますが、それでも長い時間がかかります。元の設定を使用したビルド時間(〜14 vs〜1分)を使用CFLAGS='-O2 -march=native'たビルド(〜9 vs 1.5分)比較します

また、gitからのクローン作成には約1分、tarballのダウンロードと解凍には約5秒かかります。githubからgitアーカイブをダウンロードするときに、バージョン間のビルド時間を比較します(v24.5、master、およびemacs-25の場合はそれぞれ〜5、〜6、〜8分。ご覧のとおり、配布tarballを使用していない場合、すべてのビルド時間は少なくとも同じ桁数です(emacs-25がマスターよりも遅い理由、ランダムな変動である可能性、または古いコードがマスターで削除された理由がわからない場合)。

また、関連する質問で、Emacsを静かにビルドする方法を教えてください。現在、私のユニットテスト出力のほぼ80%はEmacsビルドです。理想的には、make install出力をまったく出力しないようにしたいです。

いつでも出力をリダイレクトできます/dev/null。私の実験では、make install出力をパイプラインして出力をgrep -E '^(make|[A-Z])'削減しました(Web上のログをフォーマットするTravis CI JavaScriptは、完全な出力で問題が発生していました)。

EmacsトランクをEmacs 24.5と同じくらい速くビルドできますか?

いいえ(または、Emacs 24.5で(ほぼ)Emacsトランク:pと同じくらい遅い速度でビルドできるという意味で、はい)。しかし、あなたができることは、Emacsビルドを保存し、ユニットテストのためにそのキャッシュされた結果をダウンロードすることです。これをemacs-travisフォークのアップロードブランチに実装しました。これはyasnippetによる使用例です。Emacsのインストール時間は約2.5秒です。


3

さまざまな提案があります。

  1. elcファイルがありません。

以下に述べるように、すべてのlispファイルをコンパイルすると、少なくとも時間の10%を占めます。これを無効にする1つの方法は、ファイルのloaddefsターゲットを編集して、次のlisp/Makefileように変更することです。

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. コンパイラー最適化またはデバッガーシンボルテーブルなし

現在、私は--with-x-toolkit = no --without-x --without-allを./configureに渡しています。

デフォルトのコンパイルフラグを変更するだけで、srcの Cコンパイル時間を1/4(1分弱から16秒に)に短縮できました。私が得たデフォルトのCFLAGSは:-g -O3でした。

代わりに使用してくださいCFLAGS=''

  1. 実行せずmake installsrcディレクトリ内からビルドされたemacsを実行します。

以下に述べるように、さらに10%の時間がドキュメントの作成に費やされています。時間は計りませんでしたが、でファイルをコピーしたり、elispファイルを圧縮したりするのに時間がかかることは間違いありませんmake install。そうしないでください。タイミングチャートをやり直す場合は、を実行しremake --profileます。

上記の観察は以下に基づいています...


最初のステップは、それを削減する方法を理解するために時間が費やされている場所を理解することです。幸いにも、Emacsのようなもののために、私はあなたが見つけ出すのを助けるツールを最近書いた(あるいは拡張した)。特定のターゲットで費やされた時間--profileを示すリメイクオプション(GNU makeのフォーク)を追加しました。

最近のスナップショットを作成してみましたが、はい、約10分かかります。リメイクをインストールしていない場合は、私の実行で使用できるプロファイリング情報の要点があります。私はkcachegrindを使用して情報を表示しますが、視覚化ツール用の他のツールがあるかもしれません。ランのスクリーンショットであるpngが要点にあります。

今度は詳細に...

私の実行では、時間の約20%は、実際に行う必要のないlispおよびinfoファイルの構築に費やされています。実際には、情報ファイルよりもlispファイルに少し多くの時間が費やされています。Makefileを変更してスキップすることもできます。

emacs 24と比較するのは興味深いかもしれません。私の推測では、これらの両方のサイズは比例して大きくなっています。

興味がある場合(賛成票で表示できます)、Makefileに特定のハックを提案します。しかし、これだけで、やる気のある人には十分なはずです。


「時間の20%はlispの構築に費やされています」-Emacs 25で約%60%を使用しているように見える@lunaryornのemacs- travisリポジトリをクローンしましたmake lisptravis-ci.org/npostavs/emacs-travis/builds/91107858。そして、大きなチャンクmake srcもlispをコンパイルしているので、これらの測定値をどのように調整するのでしょうか。Emacs 24では、cc-*.elmake lispにファイルをコンパイルするだけのように見えますが、バグですか?
npostavs 2015年

また、これは目の錯覚によるものかもしれませんが、プロファイリング画像の合計は合計で約50%に過ぎないようです。
npostavs 2015年

@npostavs remakeはターゲットの時間をプロファイルするだけで、それ自体は含まれません。lispの下にあるすべてのファイルとディレクトリでは、何をリメイクするかを計算するのに「リメイク」/「メイク」にかなりの時間が費やされている可能性があり、おそらくそうです。また、「remake」はmakeのフォークであるため、それらの動作は似ていますが、より厳密に比較するには、「make」ではなく「make」ではなく、「remake」とプロファイリングなしの「remake」の時間を比較する必要があります。また、同じremake /最後に、%などを使用して誤解する可能性もありますが、全体的な提案はデータを使用して適用されるようです
ロッキー

また、私の測定CFLAGS=''ではCのコンパイルが速くなり、lispのコンパイルが遅くなっていました。結局のところ、使用CFLAGS='-O2 -march=native'はEmacs 25の方が全体的に高速ですが、Emacs 24.5の場合は遅くなります。travis
ci.org

@npostavs観察:CFLAGSを設定すると、「Cコンパイルが速くなり、lispコンパイルが遅くなります。」しかし、単一のテストを実行する場合、全体の時間がかどうかはわかりません。ある種の最適化されたCコンパイル/ビルド+ LISPコンパイル+ LISPテストの実行は、最適化されていないCコンパイル/ビルド+ LISPなしよりも少なくなります。コンパイル+ LISPテスト実行。
岩が多い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.