λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Android][ART] ART의 ν”„λ‘œνŒŒμΌ 기반 컴파일

좜처

ChatGPT

 


κ°œμš”

ART(Anroid Runtime)의 ν”„λ‘œνŒŒμΌ 기반 μ»΄νŒŒμΌμ€ Android μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•œ 기법이닀. ν”„λ‘œνŒŒμΌλ§ 데이터λ₯Ό 기반으둜 μ½”λ“œμ˜ μ‹€ν–‰ 경둜λ₯Ό λΆ„μ„ν•˜κ³ , μ΄λŸ¬ν•œ 정보λ₯Ό ν™œμš©ν•΄ μ½”λ“œμ˜ μ„±λŠ₯을 κ°œμ„ ν•˜λŠ” 방법이닀. 이 기법은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μ„ μ΄ν•΄ν•˜κ³ , 자주 μ‚¬μš©λ˜λŠ” 뢀뢄을 μ΅œμ ν™”ν•¨μ„μ¨ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κ³ , 초기 μ•± λ‘œλ”© μ‹œκ°„μ„ μ€„μ΄λŠ” 데 도움을 μ€€λ‹€.

 

ART와 ν”„λ‘œνŒŒμΌ 기반 컴파일

1. ART(Android Runtime)μ΄λž€?

  • Android μš΄μ˜μ²΄μ œμ—μ„œ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” λŸ°νƒ€μž„ ν™˜κ²½μ΄λ‹€.
  • ARTλŠ” Dalvik 가상 λ¨Έμ‹ (Dalvic VM)을 λŒ€μ²΄ν•΄, Android 5.0λΆ€ν„° κΈ°λ³Έ λŸ°νƒ€μž„ ν™˜κ²½μœΌλ‘œ μ±„νƒλ˜μ—ˆλ‹€.
  • ARTλŠ” AOT(Ahead-Of-Time) 컴파일과  JIT(Just-In-Time) μ»΄νŒŒμΌμ„ ν˜Όν•©ν•΄ μ„±λŠ₯을 μ΅œμ ν™”ν•œλ‹€.

2. ν”„λ‘œνŒŒμΌ 기반 μ»΄νŒŒμΌμ΄λž€?

ν”„λ‘œνŒŒμΌ 기반 μ»΄νŒŒμΌμ€ 앱이 μ‹€μ œλ‘œ μ‚¬μš©λ  λ•Œ μˆ˜μ§‘λœ μ‹€ν–‰ 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ, νŠΉμ • μ½”λ“œ κ²½λ‘œμ™€ λ©”μ„œλ“œλ₯Ό μ΅œμ ν™”ν•˜λŠ” κΈ°μˆ μ΄λ‹€. 이 기법은 특히 JIT μ»΄νŒŒμΌλŸ¬μ™€ AOT 컴파일러의 μ΅œμ ν™” μ „λž΅μ— ν™œμš©λœλ‹€.

1. ν”„λ‘œνŒŒμΌ 데이터 μˆ˜μ§‘

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μˆ˜μ§‘λœ ν”„λ‘œνŒŒμΌ λ°μ΄ν„°λŠ” μ–΄λ–€ λ©”μ„œλ“œκ°€ 자주 ν˜ΈμΆœλ˜λŠ”μ§€, μ–΄λ–€ 경둜둜 μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.

2. μ½”λ“œ μ΅œμ ν™”

  • μˆ˜μ§‘λœ ν”„λ‘œνŒŒμΌ 데이터λ₯Ό 기반으둜, 자주 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œμ™€ μ½”λ“œ 경둜λ₯Ό μ΅œμ ν™”ν•˜μ—¬ μ‹€ν–‰ 속도λ₯Ό κ°œμ„ ν•œλ‹€. μ΄λŠ” κ³§λ°”λ‘œ μ•±μ˜ μ„±λŠ₯ ν–₯μƒμœΌλ‘œ 이어진닀.

 

ν”„λ‘œνŒŒμΌ 기반 컴파일의 λ™μž‘ 원리

1. ν”„λ‘œνŒŒμΌ 데이터 μˆ˜μ§‘

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 처음 싀행될 λ•Œ, ν”„λ‘œνŒŒμΌλŸ¬(ν”„λ‘œνŒŒμΌλ§ 도ꡬ)κ°€ μ•±μ˜ μ‹€ν–‰ νŒ¨ν„΄μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , 자주 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ™€ ν΄λž˜μŠ€μ— λŒ€ν•œ 데이터λ₯Ό μˆ˜μ§‘ν•œλ‹€.
  • μ΄λŸ¬ν•œ λ°μ΄ν„°λŠ” '*.prof' 파일 ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

2. ν”„λ‘œνŒŒμΌ 데이터 뢄석

  • μˆ˜μ§‘λœ ν”„λ‘œνŒŒμΌ 데이터λ₯Ό λΆ„μ„ν•˜μ—¬, μ•±μ˜ μ–΄λ–€ 뢀뢄이 κ°€μž₯ λΉˆλ²ˆν•˜κ²Œ μ‹€ν–‰λ˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • 자주 μ‹€ν–‰λ˜λŠ” λ©”μ„œλ“œ, 클래슀 μ΄ˆκΈ°ν™”, 루프 등을 μ‹λ³„ν•œλ‹€.

3. μ½”λ“œ 컴파일 및 μ΅œμ ν™”

  • JIT μ»΄νŒŒμΌλŸ¬λŠ” λŸ°νƒ€μž„μ— 자주 μ‚¬μš©λ˜λŠ” μ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ 속도λ₯Ό 높인닀. 
  • AOT μ»΄νŒŒμΌλŸ¬λŠ” ν”„λ‘œνŒŒμΌλ§μ„ 톡해 μˆ˜μ§‘λœ μ‹€ν–‰ 데이터λ₯Ό μ‚¬μš©ν•΄, 자주 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ™€ 클래슀의 λ„€μ΄ν‹°λΈŒ μ½”λ“œ 버전을 미리 μƒμ„±ν•œλ‹€.
  • μ΅œμ ν™”λœ μ½”λ“œλŠ” λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€μŒ μ‹€ν–‰ μ‹œ 더 λΉ λ₯΄κ²Œ λ‘œλ“œλœλ‹€.

4. ν”„λ‘œνŒŒμΌ 주기적 μ—…λ°μ΄νŠΈ

  • ν”„λ‘œνŒŒμΌλ§ λ°μ΄ν„°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‚¬μš© νŒ¨ν„΄μ΄ 변경될 λ•Œ 주기적으둜 μ—…λ°μ΄νŠΈλœλ‹€. 이λ₯Ό 톡해, μ΅œμ‹  μ‚¬μš© νŒ¨ν„΄μ— 맞좰 μ΅œμ ν™” μˆ˜μ€€μ„ μœ μ§€ν•œλ‹€.

ν”„λ‘œνŒŒμΌ 기반 컴파일의 μž₯점

1. ν–₯μƒλœ μ„±λŠ₯

  • 자주 μ‚¬μš©λ˜λŠ” κ²½λ‘œμ™€ λ©”μ„œλ“œκ°€ μ΅œμ ν™”λ˜μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€ν–‰ 속도가 빨라진닀. μ΄λŠ” μ‚¬μš©μž κ²½ν—˜μ„ 크게 ν–₯μƒμ‹œν‚¨λ‹€.

2. μ΅œμ†Œν™”λœ μ•± μ‹œμž‘ μ‹œκ°„

  • 자주 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œμ™€ ν΄λž˜μŠ€κ°€ 미리 μ΅œμ ν™”λœ μƒνƒœλ‘œ μ œκ³΅λ˜λ―€λ‘œ, μ•±μ˜ 초기 λ‘œλ”© μ‹œκ°„μ΄ κ°μ†Œν•œλ‹€.
  • μ•±μ˜ 첫 μ‹€ν–‰ μ‹œ AOT μ»΄νŒŒμΌμ„ 톡해, 이후 μ‹€ν–‰μ—μ„œλŠ” λΉ λ₯Έ μ‹œμž‘μ„ 보μž₯ν•œλ‹€.

3. 배터리 νš¨μœ¨μ„±

  • μ΅œμ ν™”λœ μ½”λ“œ 싀행은 CPU와 λ©”λͺ¨λ¦¬ μžμ›μ˜ νš¨μœ¨μ„±μ„ λ†’μ—¬, μ „λ ₯ μ†Œλͺ¨λ₯Ό μ€„μ΄λŠ” 데 κΈ°μ—¬ν•œλ‹€.

4. λ””μŠ€νŠΈ 곡간 μ ˆμ•½

  • ν•„μš”ν•˜μ§€ μ•Šμ€ μ½”λ“œμ˜ μ»΄νŒŒμΌμ„ ν”Όν•¨μœΌλ‘œμ¨, λ””μŠ€ν¬ 곡간을 μ ˆμ•½ν•  수 μžˆλ‹€.

예제 μ‹œλ‚˜λ¦¬μ˜€

λ‹€μŒμ€ ν”„λ‘œνŒŒμΌ 기반 컴파일의 ꡬ체적인 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ„€λͺ…ν•œλ‹€.

1. μ•±μ˜ 초기 μ‹€ν–‰

1. μ•± μ„€μΉ˜ 및 초기 μ‹€ν–‰

  • μ‚¬μš©μžκ°€ 앱을 μ„€μΉ˜ν•˜κ³  처음 μ‹€ν–‰ν•  λ•Œ, ARTλŠ” 기본적으둜 AOT μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•˜μ—¬ μ•±μ˜ μ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€ν™˜ν•œλ‹€.
  • 이 κ³Όμ •μ—μ„œ 일뢀 κΈ°λ³Έ μ΅œμ ν™”κ°€ μ μš©λ˜μ§€λ§Œ, 아직 μ‚¬μš©μž νŒ¨ν„΄μ— λŒ€ν•œ 정보가 μΆ©λΆ„ν•˜μ§€ μ•Šλ‹€.

2. ν”„λ‘œνŒŒμΌλ§ 데이터 μˆ˜μ§‘

  • μ‚¬μš©μžκ°€ 앱을 μ‚¬μš©ν•˜λ©΄μ„œ ν”„λ‘œνŒŒμΌλŸ¬κ°€ μ–΄λ–€ λ©”μ„œλ“œκ°€ 자주 호좜되고, μ–΄λ–€ ν΄λž˜μŠ€κ°€ 자주 μ΄ˆκΈ°ν™”λ˜λŠ”μ§€μ— λŒ€ν•œ 데이터λ₯Ό μˆ˜μ§‘ν•œλ‹€.
  • μˆ˜μ§‘λœ ν”„λ‘œνŒŒμΌ λ°μ΄ν„°λŠ” λ‹€μŒ μ‹€ν–‰μ—μ„œ μ΅œμ ν™”μ— ν™œμš©λœλ‹€.

2. 두 번째 μ‹€ν–‰ 및 이후 μ‹€ν–‰

3. ν”„λ‘œνŒŒμΌ 기반 μ΅œμ ν™”

  • 앱을 두 번째둜 μ‹€ν–‰ν•  λ•Œ, ARTλŠ” μˆ˜μ§‘λœ ν”„λ‘œνŒŒμΌ 데이터λ₯Ό 기반으둜 자주 ν˜ΈμΆœλ˜λŠ” μ½”λ“œ 경둜λ₯Ό JIT λ˜λŠ” AOT둜 μ΅œμ ν™”ν•œλ‹€.
  • ν•„μš”μ‹œ, μƒˆλ‘œμš΄ μ½”λ“œ νŒ¨ν„΄μ— 맞좰 μ΅œμ ν™”λ₯Ό μ‘°μ •ν•œλ‹€.

4. μ‹€ν–‰ 속도 및 λ°˜μ‘μ„± ν–₯상

  • μ΅œμ ν™”λœ μ½”λ“œ 덕뢄에 μ•±μ˜ μ‹€ν–‰ 속도가 빨라지고, μ‚¬μš©μžμ˜ μΈν„°νŽ˜μ΄μŠ€μ˜ λ°˜μ‘μ„±μ΄ κ°œμ„ λœλ‹€.
  • λ©”μ„œλ“œ 호좜이 μ¦‰κ°μ μœΌλ‘œ 이루어지며, CPU λΆ€ν•˜κ°€ κ°μ†Œν•˜μ—¬ μ „λ ₯ 효율이 ν–₯μƒλœλ‹€.

 

ν”„λ‘œνŒŒμΌ 기반 컴파일의 μ‹€μ œ μ‚¬μš© 예

예제 μ½”λ“œ

public class ExampleActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        
        // λΉˆλ²ˆν•˜κ²Œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ
        frequentlyCalledMethod();
    }

    private void frequentlyCalledMethod() {
        // 자주 μ‹€ν–‰λ˜λŠ” μ½”λ“œ
        for (int i = 0; i < 1000; i++) {
            Log.d("ExampleActivity", "Loop iteration: " + i);
        }
    }
}

 

μœ„μ˜ 'frequentlyCalledMethod()' λ©”μ„œλ“œλŠ” 자주 호좜되며, ARTλŠ” 이 λ©”μ„œλ“œμ˜ μ‹€ν–‰ νŒ¨ν„΄μ„ ν”„λ‘œνŒŒμΌλ§ν•΄ μ΅œμ ν™”ν•œλ‹€.

 

μ‹€ν–‰κ³Όμ •

1. 초기 μ‹€ν–‰

  • 'ExampleActivity'의 'frequentlyCalledMethod()'κ°€ μ‹€ν–‰λ˜κ³ , ν”„λ‘œνŒŒμΌλŸ¬κ°€ 이 λ©”μŠ€λ“œμ˜ μ‹€ν–‰ νŒ¨ν„΄μ„ μˆ˜μ§‘ν•œλ‹€.

2. ν”„λ‘œνŒŒμΌ 기반 μ΅œμ ν™”

  • μˆ˜μ§‘λœ 데이터λ₯Ό 기반으둜 'frequentlyCalledMethod()'κ°€ μ΅œμ ν™”λœλ‹€.
  • 이후 μ‹€ν–‰ μ‹œ, 이 λ©”μ„œλ“œλŠ” 더 λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜λ©°, μ•±μ˜ λ°˜μ‘μ„±μ΄ ν–₯μƒλœλ‹€.
더보기

'μ•±μ˜ λ°˜μ‘μ„±μ΄ ν–₯μƒλœλ‹€'λΌλŠ” ν‘œν˜„μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‚¬μš© μ‹œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)와 μ‚¬μš©μž κ²½ν—˜(UX)이 λ”μš± λ§€λ„λŸ½κ³  λΉ λ₯΄κ²Œ λ°˜μ‘ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

κ²°λ‘ 

ART의 ν”„λ‘œνŒŒμΌ 기반 μ»΄νŒŒμΌμ€ μ•±μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 효과적인 방법이닀. μ‹€ν–‰ 쀑 μˆ˜μ§‘λœ 데이터λ₯Ό 톡해 μ‹€μ œ μ‚¬μš© νŒ¨ν„΄μ— 맞좘 μ΅œμ ν™”κ°€ κ°€λŠ₯ν•˜λ©°, 이λ₯Ό 톡해 μ•±μ˜ 초기 μ‹€ν–‰ 속도와 μ „λ°˜μ μΈ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λ‹ˆλ‹€. μ΄λŸ¬ν•œ 기법은 특히 λͺ¨λ°”일 ν™˜κ²½μ—μ„œ 효율적인 μžμ› μ‚¬μš©κ³Ό ν–₯μƒλœ μ‚¬μš©μž κ²½ν—˜μ„ μ œκ³΅ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•œλ‹€.