私は多くの関数を持っているc++プログラムを持っていて、関数ごとに異なる.cppファイルを持っています。メインプログラムから、いくつかのパラメーターを指定し、関数を呼び出すだけです。ただし、完全なもののコンパイルには多くの時間がかかります。コンパイルごとに、メインプログラムのいくつかのパラメーターを変更するだけで、すべての関数をそのままにします。とにかくコンパイルをスピードアップする方法はありますか?
3 に答える
不要なコードを再コンパイルしています。通常、IDEはこれを自動的に処理します。それ以外の場合は、コードのコンパイル方法によって異なります。たとえば、次のような行:
g++ *.cpp
また
g++ -o program a.cpp b.cpp c.cpp
すべてのコンパイルですべてを再コンパイルするため、非常に低速です。
Makefileを作成している場合は、再コンパイルを避けるために慎重に作成する必要があります。例えば:
.PHONY: all
all: program
program: a.o b.o c.o
g++ -o $@ $^ $(LDFLAGS)
%.o: %.cpp
g++ $(CXXFLAGS) -o $@ $<
# other dependencies:
a.o: a.h
b.o: b.h a.h
c.o: c.h
上記の例では、変更するとプログラムのc.cpp
コンパイルc.cpp
とリンクが発生します。変更すると、プログラムのa.h
コンパイルa.o
とb.o
リンクが発生します。つまり、ビルドごとに、プログラムを最新の状態にするために可能な最小数のファイルをコンパイルします。
補足:Makefileを作成するときは注意してください。依存関係を見逃すと、十分なファイルをコンパイルできず、(せいぜい)セグメンテーション違反を見つけるのが困難になる可能性があります。依存関係を生成するためにそれ自体を使用してから、で生成された出力を生成できるオプションについてgcc
は、のマニュアルも参照してください。-M*
gcc
include
Makefile
- パラメータの変更による影響を受けるコードを最小限に抑えるようにしてください。理想的には、誰も依存しない1つのソースファイル(main.cpp)のみを変更します。
- インクルードを確認してください:本当にすべてが必要ですか?可能な場合は前方宣言を使用し(たとえば、の代わりに#includeを使用)、独自のクラスの場合は、可能なことを前方宣言します。
- clang(llvm.org)コンパイラを使用してみてください。gccよりも高速にコンパイルされることがあり(linux / unixを使用していると仮定)、より読みやすいエラーが発生します。
編集:私はあなたが必要なものだけを再コンパイルしていると仮定していました。他の人が示唆しているように、ビルドシステム(Makefile、IDE、CMake ...)を使用して、最小限の数のコンパイルを実行します。
たぶんこれはあまり役に立たないかもしれませんが、私はsshを介してコードを実行し、実行/コンパイルには永遠に時間がかかることを知っています。データセット全体を実行するのではなく、データファイルから読み取る場合は、1つまたは2つのファイルに対してのみ実行して、目的の結果を確認してください。これは最終結果のサンプルになりますが、それでも正確である必要があります(統計が少ないだけです)。満足のいくようにコードを調整したら、すべてを実行します。通常、その方法で問題は発生せず、コンパイル時間は比較的速くなります。