2017-12-11 3 views
0

私のライブラリのコンパイルを数秒間切るために使用できる方法はありますか?できるだけ早くライブラリをすばやくコンパイルするMakefileの最適化?

私の古いメイクファイルは、実行するには1.86秒かかり、合計で5.147個でした。 私は中に、

%.o: %.c 
    $(CC) $(FLAGS) -c -o [email protected] $< 

変更後:$(CC)$(FLAGS)-c $(OBJ:.oの= .C)@

そして、すべての出力を黙らせる私の新しいを@を追加しましたMakefileの実行には1.40秒、合計で最大3.481秒でした。

メイクファイルを最適化して、より速く実行させるか、「役に立たせる」方法があるのだろうか?わずかに高速のコンパイルされたプログラムを得るためにマイクロ調整について知るにはどこに行くのですか?

https://github.com/Hourai42/libft/blob/master/Makefile

NAME = libft.a 
FLAGS = -Wall -Wextra -Werror 
CC = gcc 
OBJ = ft_strrchr.o ft_putstr.o ft_strcmp.o ft_strlcat.o ft_memcpy.o \ 
ft_strequm.o ft_memmove.o ft_strsplit.o ft_strncpy.o ft_lstmap.o \ 
ft_lstadd.o ft_striter.o ft_strstr.o ft_isdigit.o ft_putnbr.o \ 
ft_memccpy.o ft_strdel.o ft_nmbwrd.o ft_memchr.o ft_bzero.o \ 
ft_isalnum.o ft_putstr_fd.o ft_lstiter.o ft_lstdelone.o ft_toupper.o 
\ 
ft_strcpy.o ft_lstnew.o ft_strdup.o ft_putnbr_fd.o ft_striteri.o \ 
ft_strmap.o ft_putendl_fd.o ft_memdel.o ft_strnstr.o ft_putchar.o \ 
ft_isascii.o ft_strlen.o ft_strsub.o ft_strnew.o ft_memalloc.o 
ft_putendl.o \ 
ft_strncat.o ft_itoa.o ft_strncmp.o ft_memcmp.o ft_strtrim.o 
ft_strequ.o 
\ 
ft_putchar_fd.o ft_memset.o ft_isalpha.o ft_strcat.o ft_tolower.o \ 
ft_strnequ.o ft_strjoin.o ft_atoi.o ft_strclr.o ft_strmapi.o \ 
ft_isprint.o ft_lstdel.o ft_strchr.o ft_mallocwrd.o ft_countplace.o \ 
ft_isprime.o ft_hassqrt.o ft_fibonacci.o ft_recursive_power.o \ 
ft_recursive_factorial.o 

all: $(NAME) 

$(NAME): 
    @$(CC) $(FLAGS) -c $(OBJ:.o=.c) 
    @ar rc $(NAME) $(OBJ) 
    @ranlib $(NAME) 

clean: 
    @/bin/rm -f $(OBJ) 

fclean: clean 
    @/bin/rm -f $(NAME) 

re: fclean all 

.PHONY: clean fclean re 
+0

あなたの現在のディレクトリに上記のcファイルしかないなら、 '@ $(CC)$(FLAGS)-c * .c'を試してみましょう。それは代用になりますが、ディスクをスキャンします。試してみる価値はあるものの、あなたのmakefileはすでに超最適化されているようです。また、パスの参照を避けるためにコマンドパスをハードコードしようとすることもできます。 –

+2

コンパイルするにはどれくらいの速度が必要ですか?それが起こる可能性はありますが、コンパイル速度が最適化する価値はありません。 –

+2

私はあなたの新しいMakefileが最初のコンパイルからいくらか速くなると信じていますが、いくつかのソースファイルだけが変更されたときに再構築を実行するのはひどいことです。おそらくこれは以前のバージョンから継承された問題ですが、いずれの場合でも高速な* re *ビルドは通常、速いビルドからのビルドよりもはるかに貴重です。 –

答えて

0
  1. (巨大な改善)する必要があるものだけをやり直します。
  2. パラレルメイクを使用してください(マルチコアCPUで実行する場合は大幅に改善されています)。
  3. レシピごとに1つのシェルのみを起動します(中程度から軽度の改善)。

例:

NAME = libft.a 
FLAGS = -Wall -Wextra -Werror 
CC = gcc 
SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c,%.o,$(SRCS)) 

.PHONY: all clean ultraclean 

all: $(NAME) 

%.o: %.c 
    @$(CC) $(FLAGS) -c -o [email protected] $< 

$(NAME): $(OBJS) 
    @ar rc $(NAME) $^ && \ 
    ranlib $(NAME) 

clean: 
    @/bin/rm -f $(OBJS) 

ultraclean: 
    @/bin/rm -f $(OBJS) $(NAME) 

そして、あなたが持っている場合、のは言わせ、6コアとハイパースレッディング:

$ make -j12 

注:もちろん、パラレルメイクと、しないでくださいreターゲットと同じように、クリーニングターゲット(cleanultraclean)とビルドターゲット(all)を並列化します。

関連する問題