반응형
특정 레포지토리에서 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")
반응형