페이지

2010년 8월 25일 수요일

Unity Build

내가 요즘 하는 프로젝트는 상당히 규모가 있는 프로젝트이고, i5컴으로 빌드에만 3시간정도가 걸린다. 그래서 빌드 시간을 줄이는 것이 생산성에 중요한 key factor이다.

Our software platform is very large  and takes 3 hours to compile with i5 machine. so it is a crucial for productivity to reduce compile time.

그래서 어떻게 빌드 타임을 줄일 수 있을까 구글링을 하던 중에 재미난 것을 발견했다. 이름하여 Unity Build.

So i googled about it and found interesting article about Unity Build.

컨셉은 unity build를 위한 대표 cpp파일을 하나 만들고 그 파일에서 모든 소스 파일을 #include 하는 것.  즉 컴파일 해야하는 #cpp 파일을  줄이는 것이다.  이로서 매 cpp 마다 수행하던 preprocessing 을 줄고, 결과적으로 파일 IO가 줄어들게 되고, 이 때문에 빌드시간을 줄일 수 있다는 것.

The logic  is very simple. Unity build is all about making unity.cpp including all source files with '#include' macro.  Less #cpp means less file IO. that's the point.

장점:
  • 빌드시간 많이 2-3배 단축 가능
  • CMake를 사용한다면 function 하나로 바로 unity build로 바꿀 수 있다.

Pros:
  • overall build speed is 2-3 times faster
  • If you use cmake, applying Unity build is very ease. a function will automate all process.

단점:
  • incremental build에 취약..  cpp 파일이 하나만 바뀌어도 전체 필드를 해야 하니까.
  • 기존 소스를 그대로 사용할 수 없음. MM이 더 들어감.
    • 같은 로컬 변수를 사용할 때 심볼 충돌로 컴파일 에러.
    • include hierarchy가 꼬여서 빌드 에러
    • ...


Cons:
  • bad for incremental build. if a cpp file changes all cpp files in unity.cpp will be rebuilt.
  • usually you can't use as-is cpp. need more work!
    • compile error for same local variable in different cpp
    • compile error due to include hierarchy conflict
    • ...


우리 프로젝에 당장 적용할 수는 없지만, 흥미로운 시도임에는 틀림없다.  이 idea 기반으로 preprocessing과정 cache를 잘하면 빌드를 엄청 빨리 할 수 있다는 것이된다. next-gen 컴파일러는 아마 이런것을 지원 하겠지?

I can't use this in current project but this approach is very interesting and deserves mention. it means If we can cache  the preprcessing process, we can do much better ? will next gen compiler  implement this ?