SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
Ninja
The Performance of Open Source Application
devgrapher@gmail.com
2014. 6. 28.
Ninja Overview
A small build system with a focus on speed
Ninja
Make 와 같은 빌드 시스템
작고 속도에 최적화
Google Chrome 용으로 시작
탄생 배경
Google Chome의 소스 파일 크기는 4만개 이상
전체빌드 소요시간 1시간 (i7, 16GB, SSD)
소스 한 줄 수정후 증분 빌드 시간 5분
대부분 Link 작업에 소요됨
Chrome의 빌드구조
GYP, 플랫폼 독립적인 타겟 프로젝트 생성
Visual Studio, Xcode, Ninja
빌드에 포함할, .cc, .h 등의 파일들의 나열
Ninja, 컴파일러를 실행하여 빌드할 파일을 생성
커맨드라인 명령의 나열
gcc -c foo.c -o foo.o
Compiler, 실제 빌드 작업을 수행
GYP Ninja Compiler
Ninja가 하는 일
Rule 생성
!
!
변수
cflags = -Wall
rule compile
command = gcc $cflags -c $in -o $out
rule compile
command = gcc -Wall -c $in -o $out
build out/foo.o: compile src/foo.c
build out/bar.o: compile src/bar.c
추상화
텍스트 기반, 가독성이 중요
Ninja가 하는 일
빌드가 필요한 대상을 찾기
빌드 의존성 그래프 생성
특정 노드가 수정되었으면 의존성 그래프에 따라 빌드해야할 집합 생성
실행
빌드가 필요한 그래프 간선을 따라다니며 빌드 실행
Optimizing Ninja
A small build system with a focus on speed
문자열 파싱
Chrome은 10MB 이상의 Ninja 스크립트 파일을 생성함
static bool IsIdentifierCharacter(char c) {
return
('a' <= c && c <= 'z') ||
('A' <= c && c <= 'Z') ||
// and so on...
}
cs = set()
for c in string.ascii_letters + string.digits + r'+,-./_$':
cs.add(ord(c))
for i in range(256):
print '%d,' % (i in cs),
Lookup Table 이용
정규화
Ninja는 수많은 파일 경로를 다루므로 최적화된 경로 식별 방법 필요
/bar.h
/foo/../bar.h
/bar.h
/bar.cc
/abc.h
/abc.c
경로 객체 경로 비교
0x2000
0x3000
Memory Addr
단순 포인터 비교연산
≠
빌드 로그
이전 빌드와 새로운 빌드간의 로그를 비교해야함
이 역시 다량의 문자열 비교이므로 병목지점임
문자열 대신 명령의 해시를 기록하고 비교
200MB -> 2MB 미만, 20배 시간 단축
의존성 파일 분석
#include “bar.h”
…
foo.c
#include “baz.h”
…
bar.h
class foo; baz.h
#include “bar.h”
…
#include “baz.h”
…
class bar;
baz.h 수정
모두 재빌드 필요
의존성 파일 분석
방법들
헤더 스캐너 사용, 느리고 부정확
의존성을 일일이 빌드파일에 수작업으로 명시, 유지보수 어려움
컴파일러가 컴파일시점에 출력하게 함.(gcc, visual studio 모두지원)
gcc -> Makefile 형식으로 의존성 출력
총 용량 약 90MB. 빌드시작할때 이걸 모두 분석한 뒤에 빌드를 시작하기엔 시간소모가 큼
의존성 처리시점을 지연
컴파일이 이뤄지는 동안 Ninja가 하는 일은 컴파일러 프로세스 종료를 대기하는 것 뿐, 이시간을 이용
대기시간동안 의존성 정보파일을 파싱, 정규화, 의존성 처리
빌드의 실행
빌드 실행성능은 전적으로 컴파일러에 의존
병렬실행의 결과를 버퍼에 저장후 순차적으로 출력
명령행 버퍼링.
빌드 성공시 출력은 단 한줄
Ninja가 빠르다는 느낌을 주는데 일조.
조용히 빠르게 치고 빠진다는 특징에서 Ninja의 이름이 비롯됨
Windows 이슈
명령줄의 최대 길이가 비교적 짧음 (8191 chars)
파일연산이 느림
GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림
파일 의존성 출력 이슈
Visual Studio 의존성 파일
gcc
Makefile 형식
변환파일 생성
Windows 이슈
명령줄의 최대 길이가 비교적 짧음 (8191 chars)
파일연산이 느림
GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림
파일 의존성 출력 이슈
Visual Studio 의존성 파일
gcc
Makefile 형식
변환파일 생성
병목지점
Windows 이슈
명령줄의 최대 길이가 비교적 짧음 (8191 chars)
파일연산이 느림
GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림
파일 의존성 출력 이슈
Visual Studio
Ninja 명령행
버퍼링 기능
gcc
Makefile 형식
변환명령행 출력
기존의 명령행 버퍼링 기능을 재사용하여 파일작업 제거
Design Principles
A small build system with a focus on speed
Design Principles
더 최적화 하기, Ninja Daemon
PC에 항상 상주하여 파일수정감시, 성능 향상 가능
하지만 Ninja의 설계 원칙은 Simplicity
단순함은 소프트웨어 설계의 미덕
중요한건 얼마나 단순함을 오래 유지하는가
복잡한 작동방식을 동원하는 대신 작업을 줄임으로써 속도를 올린다는 원칙
Design Principles
최대한 많은 기능들을 다른 도구에 위임
GYP, CMake
Ninja 자신은 빌드를 만들어내는 목표 하나에만 집중
덕분에 다른 프로젝트에서 가져다 조립해 사용하기 쉬움
빠른 빌드의 의미
프로젝트가 가볍다는 인상을 주면 프로젝트를 가지고 노는 것이 즐거워진다
가지고 놀기 좋은 코드가 소프트웨어 작성의 목표
References
http://martine.github.io/ninja/
http://aosabook.org/en/posa/ninja.html

Contenu connexe

Tendances

The Expression Problem - Part 2
The Expression Problem - Part 2The Expression Problem - Part 2
The Expression Problem - Part 2Philip Schwarz
 
React Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxReact Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxAleksandarKondov
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다wonmin lee
 
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Simplilearn
 
The Expression Problem - Part 1
The Expression Problem - Part 1The Expression Problem - Part 1
The Expression Problem - Part 1Philip Schwarz
 
Introduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectIntroduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectJadson Santos
 
How to go about testing in React?
How to go about testing in React? How to go about testing in React?
How to go about testing in React? Lisa Gagarina
 
React workshop presentation
React workshop presentationReact workshop presentation
React workshop presentationBojan Golubović
 
Lessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in ProductionLessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in ProductionPanjamapong Sermsawatsri
 
Angular 8
Angular 8 Angular 8
Angular 8 Sunil OS
 
Drools 6 deep dive
Drools 6 deep diveDrools 6 deep dive
Drools 6 deep diveMario Fusco
 
Javascript Clean Code
Javascript Clean CodeJavascript Clean Code
Javascript Clean CodePetra Barus
 
Server-side JS with NodeJS
Server-side JS with NodeJSServer-side JS with NodeJS
Server-side JS with NodeJSLilia Sfaxi
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git민태 김
 
Golang (Go Programming Language)
Golang (Go Programming Language)Golang (Go Programming Language)
Golang (Go Programming Language)ShubhamMishra485
 
Angular App Presentation
Angular App PresentationAngular App Presentation
Angular App PresentationElizabeth Long
 

Tendances (20)

The Expression Problem - Part 2
The Expression Problem - Part 2The Expression Problem - Part 2
The Expression Problem - Part 2
 
React Architecture & Best Practices.pptx
React Architecture & Best Practices.pptxReact Architecture & Best Practices.pptx
React Architecture & Best Practices.pptx
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
 
The Expression Problem - Part 1
The Expression Problem - Part 1The Expression Problem - Part 1
The Expression Problem - Part 1
 
Git basic
Git basicGit basic
Git basic
 
Introduction to angular with a simple but complete project
Introduction to angular with a simple but complete projectIntroduction to angular with a simple but complete project
Introduction to angular with a simple but complete project
 
How to go about testing in React?
How to go about testing in React? How to go about testing in React?
How to go about testing in React?
 
React workshop presentation
React workshop presentationReact workshop presentation
React workshop presentation
 
Lessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in ProductionLessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in Production
 
Angular 8
Angular 8 Angular 8
Angular 8
 
Drools 6 deep dive
Drools 6 deep diveDrools 6 deep dive
Drools 6 deep dive
 
Javascript Clean Code
Javascript Clean CodeJavascript Clean Code
Javascript Clean Code
 
Server-side JS with NodeJS
Server-side JS with NodeJSServer-side JS with NodeJS
Server-side JS with NodeJS
 
GitHub Presentation
GitHub PresentationGitHub Presentation
GitHub Presentation
 
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
버전관리를 들어본적 없는 사람들을 위한 DVCS - Git
 
Golang (Go Programming Language)
Golang (Go Programming Language)Golang (Go Programming Language)
Golang (Go Programming Language)
 
React js
React jsReact js
React js
 
Bootstrap 5 ppt
Bootstrap 5 pptBootstrap 5 ppt
Bootstrap 5 ppt
 
Angular App Presentation
Angular App PresentationAngular App Presentation
Angular App Presentation
 

Similaire à Ninja

FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발현승 배
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계chcbaram
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반arundine
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기Jaeseung Ha
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기Jaeseung Ha
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows TerminalOnGameServer
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기CONNECT FOUNDATION
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdfssuserb942d2
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
cross compile
cross compilecross compile
cross compilehe4722
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트Chanwoong Kim
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 

Similaire à Ninja (20)

FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발FCGI, C++로 Restful 서버 개발
FCGI, C++로 Restful 서버 개발
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
피니엔진
피니엔진피니엔진
피니엔진
 
cross compile
cross compilecross compile
cross compile
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 

Plus de Ji Hun Kim

Doing data science Chapter 9
Doing data science Chapter 9Doing data science Chapter 9
Doing data science Chapter 9Ji Hun Kim
 
Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Ji Hun Kim
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
High performance networking in chrome
High performance networking in chromeHigh performance networking in chrome
High performance networking in chromeJi Hun Kim
 
Api design for c++ 6장
Api design for c++ 6장Api design for c++ 6장
Api design for c++ 6장Ji Hun Kim
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
Python packaging
Python packagingPython packaging
Python packagingJi Hun Kim
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part oneJi Hun Kim
 

Plus de Ji Hun Kim (11)

Doing data science Chapter 9
Doing data science Chapter 9Doing data science Chapter 9
Doing data science Chapter 9
 
Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기Arduino 소개, RC카 만들기
Arduino 소개, RC카 만들기
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
High performance networking in chrome
High performance networking in chromeHigh performance networking in chrome
High performance networking in chrome
 
Api design for c++ 6장
Api design for c++ 6장Api design for c++ 6장
Api design for c++ 6장
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
Code 25장
Code 25장Code 25장
Code 25장
 
Code 17장
Code 17장Code 17장
Code 17장
 
Code 10장
Code 10장Code 10장
Code 10장
 
Python packaging
Python packagingPython packaging
Python packaging
 
읽기 좋은 코드가 좋은 코드다 Part one
읽기 좋은 코드가 좋은 코드다   Part one읽기 좋은 코드가 좋은 코드다   Part one
읽기 좋은 코드가 좋은 코드다 Part one
 

Ninja

  • 1. Ninja The Performance of Open Source Application devgrapher@gmail.com 2014. 6. 28.
  • 2. Ninja Overview A small build system with a focus on speed
  • 3. Ninja Make 와 같은 빌드 시스템 작고 속도에 최적화 Google Chrome 용으로 시작
  • 4. 탄생 배경 Google Chome의 소스 파일 크기는 4만개 이상 전체빌드 소요시간 1시간 (i7, 16GB, SSD) 소스 한 줄 수정후 증분 빌드 시간 5분 대부분 Link 작업에 소요됨
  • 5. Chrome의 빌드구조 GYP, 플랫폼 독립적인 타겟 프로젝트 생성 Visual Studio, Xcode, Ninja 빌드에 포함할, .cc, .h 등의 파일들의 나열 Ninja, 컴파일러를 실행하여 빌드할 파일을 생성 커맨드라인 명령의 나열 gcc -c foo.c -o foo.o Compiler, 실제 빌드 작업을 수행 GYP Ninja Compiler
  • 6. Ninja가 하는 일 Rule 생성 ! ! 변수 cflags = -Wall rule compile command = gcc $cflags -c $in -o $out rule compile command = gcc -Wall -c $in -o $out build out/foo.o: compile src/foo.c build out/bar.o: compile src/bar.c 추상화 텍스트 기반, 가독성이 중요
  • 7. Ninja가 하는 일 빌드가 필요한 대상을 찾기 빌드 의존성 그래프 생성 특정 노드가 수정되었으면 의존성 그래프에 따라 빌드해야할 집합 생성 실행 빌드가 필요한 그래프 간선을 따라다니며 빌드 실행
  • 8. Optimizing Ninja A small build system with a focus on speed
  • 9. 문자열 파싱 Chrome은 10MB 이상의 Ninja 스크립트 파일을 생성함 static bool IsIdentifierCharacter(char c) { return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || // and so on... } cs = set() for c in string.ascii_letters + string.digits + r'+,-./_$': cs.add(ord(c)) for i in range(256): print '%d,' % (i in cs), Lookup Table 이용
  • 10. 정규화 Ninja는 수많은 파일 경로를 다루므로 최적화된 경로 식별 방법 필요 /bar.h /foo/../bar.h /bar.h /bar.cc /abc.h /abc.c 경로 객체 경로 비교 0x2000 0x3000 Memory Addr 단순 포인터 비교연산 ≠
  • 11. 빌드 로그 이전 빌드와 새로운 빌드간의 로그를 비교해야함 이 역시 다량의 문자열 비교이므로 병목지점임 문자열 대신 명령의 해시를 기록하고 비교 200MB -> 2MB 미만, 20배 시간 단축
  • 12. 의존성 파일 분석 #include “bar.h” … foo.c #include “baz.h” … bar.h class foo; baz.h #include “bar.h” … #include “baz.h” … class bar; baz.h 수정 모두 재빌드 필요
  • 13. 의존성 파일 분석 방법들 헤더 스캐너 사용, 느리고 부정확 의존성을 일일이 빌드파일에 수작업으로 명시, 유지보수 어려움 컴파일러가 컴파일시점에 출력하게 함.(gcc, visual studio 모두지원) gcc -> Makefile 형식으로 의존성 출력 총 용량 약 90MB. 빌드시작할때 이걸 모두 분석한 뒤에 빌드를 시작하기엔 시간소모가 큼 의존성 처리시점을 지연 컴파일이 이뤄지는 동안 Ninja가 하는 일은 컴파일러 프로세스 종료를 대기하는 것 뿐, 이시간을 이용 대기시간동안 의존성 정보파일을 파싱, 정규화, 의존성 처리
  • 14. 빌드의 실행 빌드 실행성능은 전적으로 컴파일러에 의존 병렬실행의 결과를 버퍼에 저장후 순차적으로 출력 명령행 버퍼링. 빌드 성공시 출력은 단 한줄 Ninja가 빠르다는 느낌을 주는데 일조. 조용히 빠르게 치고 빠진다는 특징에서 Ninja의 이름이 비롯됨
  • 15. Windows 이슈 명령줄의 최대 길이가 비교적 짧음 (8191 chars) 파일연산이 느림 GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림 파일 의존성 출력 이슈 Visual Studio 의존성 파일 gcc Makefile 형식 변환파일 생성
  • 16. Windows 이슈 명령줄의 최대 길이가 비교적 짧음 (8191 chars) 파일연산이 느림 GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림 파일 의존성 출력 이슈 Visual Studio 의존성 파일 gcc Makefile 형식 변환파일 생성 병목지점
  • 17. Windows 이슈 명령줄의 최대 길이가 비교적 짧음 (8191 chars) 파일연산이 느림 GetFileAttributesEx()는 리눅스의 stat()보다 100배는 느림 파일 의존성 출력 이슈 Visual Studio Ninja 명령행 버퍼링 기능 gcc Makefile 형식 변환명령행 출력 기존의 명령행 버퍼링 기능을 재사용하여 파일작업 제거
  • 18. Design Principles A small build system with a focus on speed
  • 19. Design Principles 더 최적화 하기, Ninja Daemon PC에 항상 상주하여 파일수정감시, 성능 향상 가능 하지만 Ninja의 설계 원칙은 Simplicity 단순함은 소프트웨어 설계의 미덕 중요한건 얼마나 단순함을 오래 유지하는가 복잡한 작동방식을 동원하는 대신 작업을 줄임으로써 속도를 올린다는 원칙
  • 20. Design Principles 최대한 많은 기능들을 다른 도구에 위임 GYP, CMake Ninja 자신은 빌드를 만들어내는 목표 하나에만 집중 덕분에 다른 프로젝트에서 가져다 조립해 사용하기 쉬움 빠른 빌드의 의미 프로젝트가 가볍다는 인상을 주면 프로젝트를 가지고 노는 것이 즐거워진다 가지고 놀기 좋은 코드가 소프트웨어 작성의 목표