2017-12-11 12 views
0

내 라이브러리를 몇 초 동안 면도 할 수있는 방법이 있습니까?가능한 한 빨리 라이브러리를 빠르게 컴파일하기위한 메이크 파일 최적화?

내 오래된 메이크 파일이 실행될 때까지 1.86 초가 걸리고 총 5.147 회까지 실행됩니다. 나는 속으로

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

변경 후 : $ (CC) $ (FLAGS) -c $ (OBJ : .o 인 =이 .c) @

그리고, 모든 출력을 침묵 내 새를 @ 추가 Makefile은 실행에 1.40 초, 총 3.481 초가 걸렸습니다.

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은 스크래치 컴파일보다 다소 빠르다고 믿을 수 있지만 몇 가지 소스 파일 만 변경된 경우 다시 작성하는 것은 끔찍한 일입니다. 아마도 이전 버전에서 상속 된 문제 일 수 있지만, 빠른 * 빌드 * 빌드는 대개 스크래치 빌드보다 빠릅니다. –

답변

0
  1. 다시 실행을

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

    .
  2. 병렬 make를 사용하십시오 (멀티 코어 CPU에서 실행되는 경우 크게 개선됨).
  3. 레시피 하나당 하나의 쉘만 호출하십시오 (보통에서 약간의 향상).

예 :

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 대상에서와 같이 청소 대상 (clean, ultraclean) 및 건물 대상 (all)을 병렬 처리하십시오.