본문 바로가기

Develop

[C++] Ninja 파일별 컴파일 시간 측정

반응형

특정 레포지토리에서 ninja로 컴파일을 진행할때, 어떤 파일에 대해서 속도가 느린지 조사해보고싶어서 찾아보게되었고 글로 정리해보려고한다.

 

일단 Ninja로 컴파일을 할때 아래와같은 명령어로 진행한다.

ninja -d stats

 

그런다음에 빌드가 다된이후, ls -al 명령어로 파일들을 조회해보면 .ninja_log라는 파일이 생성된것을 볼수가 있다. 간단한 예시로 아래와같이 내용이 적혀있다.

220067	256602	1704266700231063803	backend/test1.cpp.o	b9e842d3f244604d
216696	256612	1704266700235430337	backend/test2.cpp.o	de7f55dc134f99b4
216701	256667	1704266700287629089	backend/test3.cpp.o	e3c5460720870c13
218575	256678	1704266700291205753	backend/test4.cpp.o	d95bdab419a6b1ab

 

일단 각 요소에 대한 시간소요를 측정하는게 목적이니 다른건 필요없고, 첫번째 인자값과 두번째 인자값만 보면된다. 그리고 (두번째 인자값 - 첫번째 인자값)이 해당 파일을 빌드하는데 소요된 시간이다. 단위는 ms이다.

 

즉, test1.cpp.o파일은 256602-220067 이므로 36535ms가 게산되고 이는 약 36초가 소요된걸 알수있다.

 

마지막으로 .ninja_log를 파싱해서 각 요소들이 컴파일에 소요된 시간을 뽑을수있는 python코드를 공유한다.

f = open('/jaeyung_test/build/.ninja_log', 'r')

build_time = {}
for index, line in enumerate(f.readlines()):
    if index == 0:
        continue
    line = line.replace('\t', ' ').replace('\n', '')
    items = line.split(' ')
    build_time[items[3]] = int(items[1]) - int(items[0])

sorted_build_time = dict(sorted(build_time.items(), key=lambda x:x[1]))
for i in sorted_build_time:
    print(f"{i} -> {int(sorted_build_time[i])/1000}s")
반응형