Ninja: νœ΄λ¦¬μŠ€ν‹±: μž…λ ₯이 적은 μž‘μ—…λ³΄λ‹€ μž…λ ₯이 큰 μž‘μ—… μ‹€ν–‰

에 λ§Œλ“  2016λ…„ 07μ›” 15일  Β·  14μ½”λ©˜νŠΈ  Β·  좜처: ninja-build/ninja

LLVM λΉŒλ“œμ—λŠ” λ‹€λ₯Έ νŒŒμΌλ³΄λ‹€ μ»΄νŒŒμΌν•˜λŠ” 데 훨씬 였래 κ±Έλ¦¬λŠ” 파일이 μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 ν•˜λ‚˜μΈ 30,000μ€„μ§œλ¦¬ C++ 파일(묻지 μ•ŠμŒ)의 파일 이름은 μ•ŒνŒŒλ²³μˆœμœΌλ‘œ κ½€ λŠ¦μ—ˆκ³  λŒ€λΆ€λΆ„μ˜ λ‹€λ₯Έ λŒ€μƒμ΄ λΉŒλ“œλ₯Ό 마친 ν›„ μ˜€λž˜λ„λ‘ νšŒμ „ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

λ‹Œμžκ°€ κ²½ν—˜μ  λ°©λ²•μœΌλ‘œ κ·œμΉ™ μž…λ ₯의 κ²°ν•©λœ 크기λ₯Ό μ‚΄νŽ΄λ³΄κ³  더 큰 μž…λ ₯이 μžˆλŠ” κ·œμΉ™μ„ λ¨Όμ € μ‹€ν–‰ν•  수 μžˆλ‹€λ©΄ λ©‹μ§ˆ κ²ƒμž…λ‹ˆλ‹€.

feature

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

NinjaλŠ” μž‘μ—… μ‹œκ°„μ„ μ ˆμ•½ν•˜λ―€λ‘œ ν•΄λ‹Ή 정보가 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λΉŒλ“œκ°€ 졜적이 아닐 μˆ˜λ„ μžˆμ§€λ§Œ ninja deps λ‘œκ·Έλ„ μ±„μ›Œμ§€μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이미 κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  14 λŒ“κΈ€

컴파일 μ‹œκ°„μ΄ κ³ μœ ν•˜κ²Œ 파일 크기의 ν•¨μˆ˜μΈμ§€ ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ κΉ¨κΈ° νž˜λ“  μž‘μ€ 파일과 μ‚¬μ†Œν•œ 큰 νŒŒμΌμ„ 상상할 수 μžˆμŠ΅λ‹ˆλ‹€.

컴파일 μ‹œκ°„μ΄ κ³ μœ ν•˜κ²Œ 파일 크기의 ν•¨μˆ˜μΈμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

그렇지 μ•Šλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  컴파일 μ‹œκ°„μ€ ν™•μ‹€νžˆ 파일 크기와 μ–‘μ˜ 상관관계가 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 이 νœ΄λ¦¬μŠ€ν‹±μ˜ 이점.

λ˜ν•œ λ‹ŒμžλŠ” μΌμ’…μ˜ PGO(ν”„λ‘œνŒŒμΌ 기반 μ΅œμ ν™”):+1: 각 νŒŒμΌμ„ μ»΄νŒŒμΌν•˜λŠ” 데 κ±Έλ¦° μ‹œκ°„ 정보λ₯Ό μˆ˜μ§‘ν•˜κ³  이 정보λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ λΉŒλ“œμ—μ„œ 파일의 μš°μ„  μˆœμœ„λ₯Ό μ •ν•˜λŠ” 것과 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  컴파일 μ‹œκ°„μ€ ν™•μ‹€νžˆ 파일 크기와 μ–‘μ˜ 상관관계가 μžˆμŠ΅λ‹ˆλ‹€.

μ†ŒμŠ€ νŒŒμΌμ„ 기반으둜 ν•˜λŠ” νœ΄λ¦¬μŠ€ν‹±μ€ μ˜λ―Έκ°€ μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 거의 1λΆ„ λ™μ•ˆ μ»΄νŒŒμΌλ˜λŠ” 천 쀄 미만의 C++ 파일이 μžˆμŠ΅λ‹ˆλ‹€(묻지 μ•ŠμŒ). ꢁ극적으둜 μ „μ²˜λ¦¬κΈ°μš© 파일이 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€μ™€ 컴파일 쀑에 μΈμŠ€ν„΄μŠ€ν™”ν•  ν…œν”Œλ¦Ώ μˆ˜μ— 따라 λ‹€λ¦…λ‹ˆλ‹€.

λ¬Όλ‘  30k 라인 파일이 1k 라인보닀 더 였래 컴파일될 것이라고 κ°€μ •ν•  수 μžˆμ§€λ§Œ λ‚΄ μƒκ°μ—λŠ” λ‹Œμžκ°€ λ‚΄λ €μ•Ό ν•  결정은 μ•„λ‹™λ‹ˆλ‹€.

각 νŒŒμΌμ„ μ»΄νŒŒμΌν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„ 정보 μˆ˜μ§‘κ³Ό 같은...

이것은 이미 .ninja_logμ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. https://github.com/nico/ninjatracing 슀크립트λ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ문 λΆ„μ„ν•˜κ³  ν¬λ‘¬μ—μ„œ λ‘œλ“œν•˜μ—¬ λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λ–»κ²Œ μ§„ν–‰λ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

...이 정보λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ λΉŒλ“œμ—μ„œ 파일의 μš°μ„  μˆœμœ„λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μš°λ¦¬λŠ” 이미 λΉŒλ“œ μ‹œκ°„ 정보λ₯Ό 가지고 있기 λ•Œλ¬Έμ— λ‹ŒμžλŠ” μ‹€μ œλ‘œ λ‹€μŒ λΉŒλ“œμ—μ„œ κ·Έ 정보λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

νŽΈμ§‘ν•˜λ‹€:

μ’‹μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 컴파일 μ‹œκ°„μ„ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. κ°€μž₯ 였래 μ»΄νŒŒμΌλ˜λŠ” νŒŒμΌμ€ https://github.com/llvm-mirror/clang/blob/master/lib/ASTMatchers/Dynamic/Registry.cpp 이며 600μ€„λ§Œ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 파일 크기 λ©”νŠΈλ¦­μ€ 이 νŠΉμ • νŒŒμΌμ— λŒ€ν•΄ μ „ν˜€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

llvm_buiild

λ˜ν•œ κ·Έ κ³Όμ •μ—μ„œ 병λͺ© ν˜„μƒμ΄ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 13개의 μŠ€λ ˆλ“œλ‘œ λΉŒλ“œν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, ν™•μ‹€ν•˜μ§€ μ•Šμ€ 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ μ‹€μ œλ‘œ LLVM 및 clangμ—μ„œ μž‘μ—…ν•©λ‹ˆλ‹€. λ‚˜λŠ” μ§€λ‚œ λͺ‡ μ£Ό λ™μ•ˆ clang/llvm λ°±μ—”λ“œμ˜ 속도λ₯Ό μ΅œμ ν™”ν•˜λŠ” 데 μ‹œκ°„μ„ λ³΄λƒˆκ³  사싀 이 κ³Όμ •μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 당신은 클랜의 κΉ¨λ—ν•œ 재건 팩이 λ§žμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ νŠΉμ • 헀더λ₯Ό ν„°μΉ˜ν•˜λ©΄ x86 isel lowering(μ•ŒνŒŒλ²³μ—μ„œ 늦게 λ‚˜νƒ€λ‚˜ 문제λ₯Ό μ•…ν™”μ‹œν‚΄)κ³Ό 같은 맀우 κΈ΄ 컴파일 쀑 ν•˜λ‚˜λ₯Ό μ‰½κ²Œ κΈ°λ‹€λ¦¬κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ 뢄석은 ν•˜λ‚˜μ˜ 파일만 보기 λ•Œλ¬Έμ— ν†΅κ³„μ μœΌλ‘œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ clang의 κΉ¨λ—ν•œ λΉŒλ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” λ‚΄ μ»΄ν“¨ν„°μ—μ„œ cpp 파일 크기(xμΆ•) λŒ€ 컴파일 μ‹œκ°„(yμΆ•)의 μ‚°μ λ„μž…λ‹ˆλ‹€.

파일 크기와 컴파일 μ‹œκ°„ 사이에 상관 관계가 μ—†λ‹€λ©΄ λ¬΄μž‘μœ„ λ…Έμ΄μ¦ˆμ²˜λŸΌ 보일 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³΄μ‹œλ‹€μ‹œν”Ό 파일 크기와 컴파일 μ‹œκ°„ μ‚¬μ΄μ—λŠ” μƒλ‹Ήν•œ 상관관계가 μžˆμŠ΅λ‹ˆλ‹€.

plt

μ–΄μ¨Œλ“  κ³Όκ±° 컴파일 μ‹œκ°„μ„ μ‚¬μš©ν•˜μ—¬ 주문을 μ•Œλ¦¬λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ¬Όλ‘  상관관계가 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ¨λ“  ν”„λ‘œμ νŠΈμ— 보편적일 수 μžˆμ„ 만큼 μΆ©λΆ„νžˆ 결정적이지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 데이터가 μ—†μ–΄μ„œ μ—¬κΈ°μ—μ„œ 틀릴 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έμ‘° #60 #376 #232

κ·ΈλŸ¬λ‚˜ λͺ¨λ“  ν”„λ‘œμ νŠΈμ— 보편적일 수 μžˆμ„ 만큼 μΆ©λΆ„νžˆ 결정적이지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ•„λ§ˆλ„ λ‚΄ μ œμ•ˆμ΄ λͺ…ν™•ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ œμ•ˆμ€ _건물 A와 B μ‚¬μ΄μ—μ„œ μž„μ˜μ˜ 선택을 ν•˜λ €λŠ” κ²½μš°μ—λŠ” 발견적 방법을 μ‚¬μš©ν•˜μ—¬ λΉŒλ“œν•˜λŠ” 데 μ‹œκ°„μ΄ 더 였래 κ±Έλ¦¬λŠ” λŒ€μƒμ„ νŒŒμ•…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. "μ§€λ‚œλ²ˆμ— λΉŒλ“œν•˜λŠ” 데 μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ κ±Έλ ΈλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€"λΌλŠ” κ²½ν—˜μ  방법은 파일 크기λ₯Ό ν™•μΈν•˜λŠ” 제 μ œμ•ˆλ³΄λ‹€ 훨씬 μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ³Όκ±° λΉŒλ“œ μ‹œκ°„μ΄ μ—†λŠ” 경우 파일 크기가 μ—¬μ „νžˆ μœ μš©ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, 더 λ‚˜μ€ νœ΄λ¦¬μŠ€ν‹±(예: μ–ΈκΈ‰ν•œ 것 쀑 ν•˜λ‚˜)이 μ μš©λ˜λŠ” 경우 이λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” 이 νœ΄λ¦¬μŠ€ν‹±μ„ μ΅œν›„μ˜ μˆ˜λ‹¨μœΌλ‘œ μ μš©ν•  것을 μ œμ•ˆν•˜λŠ” 것일 λΏμ΄λ―€λ‘œ "보편적"이 μ•„λ‹ˆλΌλŠ” 사싀이 차이λ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” 자의적인 선택을 ν•˜λ €κ³  ν–ˆκ³ , μ΄μ œλŠ” 쑰금 덜 자의적인 선택을 ν•©λ‹ˆλ‹€.

μ–΄μ¨Œλ“  κ³Όκ±° λΉŒλ“œ μ‹œκ°„μ„ λ³΄λŠ” 것이 훨씬 λ‚«μŠ΅λ‹ˆλ‹€. 파일 크기λ₯Ό 보면 크게 μ‹ κ²½ 쓰지 μ•ŠμŠ΅λ‹ˆλ‹€. :)

NinjaλŠ” 건물 A와 B μ‚¬μ΄μ—μ„œ μž„μ˜μ˜ 선택을 ν•˜κΈ° μœ„ν•œ νœ΄λ¦¬μŠ€ν‹±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. 즉, λ§€λ‹ˆνŽ˜μŠ€νŠΈμ—μ„œ λ¨Όμ € λΉŒλ“œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λŒ€μ‹  build.ninja 생성기에 νœ΄λ¦¬μŠ€ν‹±μ„ 넣을 수 μžˆμŠ΅λ‹ˆκΉŒ?

@colincross 초기 μ£Όλ¬Έμ—λŠ” λ¬Έμ œκ°€ μ—†μ§€λ§Œ 후속 주문은 타이밍을 μ‚¬μš©ν•˜μ—¬ μƒμ„±μžκ°€ κΈ°λŒ€ν•  수 μžˆλŠ” 것보닀 더 μ •ν™•ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 개인적으둜 초기 λΉŒλ“œ μ‹œκ°„μ— λŒ€ν•΄ 크게 κ±±μ •ν•˜μ§€ μ•Šμ§€λ§Œ μƒμ„±κΈ°λŠ” 그런 μ‹μœΌλ‘œ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

파일 크기λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 "ν”„λ‘œνŒŒμΌλ§"에 μΆ©λΆ„ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 포함이 λ§Žμ€ μ•„μ£Ό μž‘μ€ cpp νŒŒμΌμ€ μ²˜λ¦¬ν•˜λŠ” 데 정말 였래 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 λΉ„ 컴파일 ν”„λ‘œμ„ΈμŠ€(νŒŒμ‹±, 볡사, 파일 생성...)λŠ” 파일 크기와 관련이 μ—†μŠ΅λ‹ˆλ‹€.
κ·Έλž˜λ„ 일뢀 λΉŒλ“œ λ‹¨μœ„μ—λŠ” 쒋은 μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€.
두 번째 μ ‘κ·Ό 방식은 일뢀 νŒŒμΌμ„ λΉŒλ“œν•˜λŠ” 데 ν•„μš”ν•œ μ‹œκ°„μ„ μΊμ‹œμ— μ €μž₯ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μΊμ‹œλ₯Ό λΆ„μ„ν•˜μ—¬ μž¬κ΅¬μΆ•μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

NinjaλŠ” μž‘μ—… μ‹œκ°„μ„ μ ˆμ•½ν•˜λ―€λ‘œ ν•΄λ‹Ή 정보가 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λΉŒλ“œκ°€ 졜적이 아닐 μˆ˜λ„ μžˆμ§€λ§Œ ninja deps λ‘œκ·Έλ„ μ±„μ›Œμ§€μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이미 κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

@jlebar ,
https://go.googlesource.com/gollvm/κ³Ό λΉ„μŠ·ν•œ 것이 μžˆμŠ΅λ‹ˆλ‹€. νŠΉμ • 파일이 "λ©”λͺ¨λ¦¬ λΆ€μ‘±" 였λ₯˜λ₯Ό νŠΉμ§•μœΌλ‘œ ν•˜λŠ” 컴파일러 μΆ©λŒμ„ μ‹œν–‰ν•˜κΈ° 전에 수천 개의 컴파일된 μ†ŒμŠ€ νŒŒμΌμ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€.
ν˜„μž¬ 두 개의 파일둜 인해 μ΄λŸ¬ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
https://github.com/llvm/llvm-project/blob/7d3aace3f52f6b3f87aac432aa41ae1cdeb348eb/llvm/lib/Target/AMDGPU/AMDGPULowerIntrinsics.cpp
https://github.com/llvm/llvm-project/blob/7d3aace3f52f6b3f87aac432aa41ae1cdeb348eb/llvm/lib/Target/AArch64/AArch64PreLegalizerCombiner.cpp
Golang의 컴파일러 ν”„λ‘ νŠΈμ—”λ“œκ°€ OpenCL λ˜λŠ” OpenGLκ³Ό 관련이 μžˆλ‹€λŠ” 사싀에 μ•½κ°„μ˜ μ˜κ΅¬μ‹¬μ΄ μžˆμ§€λ§Œ(ν˜„μž¬ λ°±μ—”λ“œμ—λŠ” κ΄€λ ¨ κΈ°μ‘΄ μ΄λ²€νŠΈκ°€ μ—†μŒ) 일반 CPU ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ ARM64 지원이 μ‘΄μž¬ν•©λ‹ˆλ‹€.
μ–΄λ–€ κ²½μš°μ—λ„ CMake의 κ΅¬μ„±μ—μ„œ LLVM ν”„λ‘œμ νŠΈμ˜ 일뢀λ₯Ό λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 첫 번째 νŒŒμΌμ€ 2934개 파일 쀑 697개(κ³Όκ±° 컴파일 ν”„λ‘œμ„ΈμŠ€λŠ” 컴파일된 .o νŒŒμΌμ„ 보쑴함)이고 두 번째 파일(클린 λΉŒλ“œ λ‚΄)은 3214개 파일 쀑 817κ°œμž…λ‹ˆλ‹€.
λ‹€λ₯Έ νŒŒμΌμ„ λ¨Όμ € μ»΄νŒŒμΌν•˜λŠ” 것이 κ°€μž₯ μ’‹μœΌλ―€λ‘œ RAM을 κ°€μž₯ 많이 μ†ŒλΉ„ν•˜λŠ” νŒŒμΌμ— μ˜ˆμƒλŒ€λ‘œ κ³ μ •λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 그것듀을 λ§ˆμ§€λ§‰μœΌλ‘œ μ–»λŠ” 데 관심이 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 그리고 μ‹œλ„ν•˜κΈ° μ „μ—λŠ” μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— μ–΄λ–€ λ¬Έμ œκ°€ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ λ‚΄κ°€ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

이반

@advancedwebdeveloper μ‹€μ œλ‘œ Ninjaμ—λŠ” μ„ νƒν•œ -jN μ„€μ •κ³Ό λ³‘λ ¬λ‘œ λͺ¨λ“  것을 μ»΄νŒŒμΌν•˜κΈ°μ— μΆ©λΆ„ν•œ RAM이 μžˆλ‹€λŠ” 가정이 μžˆμŠ΅λ‹ˆλ‹€. 근본적으둜 이 λ¬Έμ œλŠ” Ninjaκ°€ μ„ νƒν•œ μˆœμ„œλ‘œ 인해 λ°œμƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ Ninja(및 λ‚΄κ°€ μ•Œκ³  μžˆλŠ” λ‹€λ₯Έ λͺ¨λ“  λΉŒλ“œ 도ꡬ)κ°€ 병렬 처리λ₯Ό μ œν•œν•˜λŠ” 맀우 거친 λ°©λ²•λ§Œ μ œκ³΅ν•œλ‹€λŠ” 사싀 λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€. -j ν”Œλž˜κ·Έμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰