ë¸ë¼ì°ì 측 ìë°ì¤í¬ë¦½í¸ ì¤í íë¦ì Node.jsì ë§ì°¬ê°ì§ë¡ ì´ë²¤í¸ 루íì 기ë°í©ëë¤.
ë°ë¼ì ì´ë²¤í¸ 루íê° ì´ë»ê² ëìíëì§ ì ì´í´íê³ ìì´ì¼ ìµì íë ì¬ë°ë¥¸ ìí¤í ì² ì¤ê³ê° ê°ë¥í´ì§ëë¤.
ì´ë² ì±í°ìì ì´ë²¤í¸ 루íê° ì´ë»ê² ëìíëì§ì ëí ì´ë¡ ê³¼ í¨ê», ì´ë¥¼ ì´ë»ê² ì¤ë¬´ì ì ì©í ì ìëì§ì ëí´ì ììë³´ê² ìµëë¤.
ì´ë²¤í¸ 루í
ì´ë²¤í¸ 루í(event loop) ì ìë ì주 ê°ë¨í©ëë¤. ì´ë²¤í¸ 루íë íì¤í¬ê° ë¤ì´ì¤ê¸¸ 기ë¤ë ¸ë¤ê° íì¤í¬ê° ë¤ì´ì¤ë©´ ì´ë¥¼ ì²ë¦¬íê³ , ì²ë¦¬í íì¤í¬ê° ìë ê²½ì°ì ì ëë, ëììì´ ëìê°ë ìë°ì¤í¬ë¦½í¸ ë´ ë£¨íì ëë¤(taskë 'ìì âì´ë¼ê³ ë²ìí ì ìëë°, 매í¬ë¡Â·ë§ì´í¬ë¡íì¤í¬ ë±ì ì©ì´ì ì¼ì¹ìí¤ê¸° ìí´ 'íì¤í¬âë¼ê³ ìì°¨ ë²ìíììµëë¤ â ì®ê¸´ì´).
ìë°ì¤í¬ë¦½í¸ ìì§ì´ ëìê°ë ìê³ ë¦¬ì¦ì ì¼ë°ííë©´ ë¤ìê³¼ ê°ìµëë¤.
- ì²ë¦¬í´ì¼ í íì¤í¬ê° ìë ê²½ì°:
- 먼ì ë¤ì´ì¨ íì¤í¬ë¶í° ìì°¨ì ì¼ë¡ ì²ë¦¬í¨
- ì²ë¦¬í´ì¼ í íì¤í¬ê° ìë ê²½ì°:
- ì ë¤ì´ ìë¤ê° ìë¡ì´ íì¤í¬ê° ì¶ê°ëë©´ ë¤ì 1ë¡ ëìê°
ë°ë¡ ì´ ìê³ ë¦¬ì¦ì´ ì°ë¦¬ê° ë¸ë¼ì°ì 를 ì¬ì©í´ ì¸í°ë·ì ìíí ë ëìê°ë ìê³ ë¦¬ì¦ì ëë¤. ì´ë ê² ìë°ì¤í¬ë¦½í¸ ìì§ì ëë¶ë¶ì ìê° ëì ìë¬´ë° ì¼ë íì§ ìê³ ì¬ê³ ìë¤ê° ì¤í¬ë¦½í¸ë í¸ë¤ë¬, ì´ë²¤í¸ê° íì±íë ëë§ ëìê°ëë¤.
ê·¸ë ë¤ë©´ ìë°ì¤í¬ë¦½í¸ ìì§ì íì±ííë íì¤í¬ì ê³¼ì° ì´ë¤ ê²ë¤ì´ ììê¹ì? ëíì ì¸ íì¤í¬ë ë¤ìê³¼ ê°ìµëë¤.
- ì¸ë¶ ì¤í¬ë¦½í¸
<script src="...">ê° ë¡ëë ë, ì´ ì¤í¬ë¦½í¸ë¥¼ ì¤ííë ê² - ì¬ì©ìê° ë§ì°ì¤ë¥¼ ìì§ì¼ ë
mousemoveì´ë²¤í¸ì ì´ë²¤í¸ í¸ë¤ë¬ë¥¼ ì¤ííë ê² setTimeoutìì ì¤ì í ìê°ì´ ë¤ ë ê²½ì°, ì½ë°± í¨ì를 ì¤ííë ê²- 기í ë±ë±
íì¤í¬ë íëì ì§í©ì ì´ë£¹ëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ì ì§í©ì ì´ë£¨ê³ ìë íì¤í¬ë¤ì ì°¨ë¡ëë¡ ì²ë¦¬íê³ , ìë¡ì´ íì¤í¬ê° ì¶ê°ë ëê¹ì§ 기ë¤ë¦½ëë¤. íì¤í¬ë¥¼ 기ë¤ë¦¬ë ëìì CPU ìì ìë¹ë 0ì ê°ê¹ìì§ê³ ìì§ì ì ë¤ê² ë©ëë¤.
ìë¡ì´ íì¤í¬ë ìì§ì´ ë°ì ë ì¶ê°ë ìë ììµëë¤. ì´ë ì´ íì¤í¬ë íì ì¶ê°ë©ëë¤.
ì´ë ê² íì¤í¬ê° ì¶ê°ëë íë V8 ì©ì´ë¡ '매í¬ë¡íì¤í¬ í(macrotask queue)'ë¼ê³ ë¶ë¦ ëë¤.
ì¢ ë 구체ì ì¸ ì¬ë¡ë¥¼ ê°ì§ê³ 매í¬ë¡íì¤í¬ íì ëí´ ììë´
ìë¤. ìì§ì´ script를 ì²ë¦¬íëë¼ ë°ìë° ì¬ì©ìê° ë§ì°ì¤ë¥¼ ìì§ì¬ mousemove ì´ë²¤í¸ë¥¼ íì±ííê³ , ë°ë¡ ì´ì´ì setTimeoutìì ì¤ì í ìê°ì´ ì§ë¬ë¤ê³ ê°ì í´ ë´
ìë¤. ì´ë ì¸ íì¤í¬ë íì íëì© ì¶ê°ëëë°, ì 그림ì ì´ë° ìí©ì ë¬ì¬í´ ë³´ììµëë¤.
íì ìë íì¤í¬ë¤ì âë¤ì´ê° ììëë¡â ì²ë¦¬ë©ëë¤. ìì§ì script를 먼ì ì²ë¦¬íê³ mousemove ì´ë²¤í¸ì í¸ë¤ë¬, setTimeout í¸ë¤ë¬ë¥¼ ìì°¨ì ì¼ë¡ ì²ë¦¬í©ëë¤.
ì§ê¸ê¹ì§ ì´ë ¤ì´ ê²ì´ ìì´ ë³´ì ëë¤. ê·¸ë ì£ ?
ì¬ê¸°ì ì ì ë ê°ì§ ì¸ë¶ ì¬íì ì§ê³ ëì´ê°ìë¤.
- ìì§ì´ í¹ì íì¤í¬ë¥¼ ì²ë¦¬íë ëìì ë ëë§ì´ ì ë ì¼ì´ëì§ ììµëë¤. íì¤í¬ë¥¼ ì²ë¦¬íë ë° ê±¸ë¦¬ë ìê°ì´ ê¸¸ì§ ìì¼ë©´ ì´ë ì í 문ì ê° ëì§ ììµëë¤. ì²ë¦¬ê° ëëë ëë¡ DOM ë³ê²½ì íë©´ì ë°ìíë©´ ë기 ë문ì ëë¤.
- íì¤í¬ ì²ë¦¬ì 긴 ìê°ì´ 걸리면, ë¸ë¼ì°ì ë íì¤í¬ë¥¼ ì²ë¦¬íë ëìì ë°ìí ì¬ì©ì ì´ë²¤í¸ ë±ì ìë¡ì´ íì¤í¬ë¤ì ì²ë¦¬íì§ ëª»í©ëë¤. ì¸í°ë· ìíì íë¤ ë³´ë©´ 'ìëµ ìë íì´ì§(Page Unresponsive)'ë¼ë ì¼ë¿ ì°½ì ë§ëê² ëë ê²½ì°ê° ì¢ ì¢ ììµëë¤. ì´ ì¼ë¿ ì°½ì ì주 ë³µì¡í ê³ì°ì´ íìíê±°ë íë¡ê·¸ëë° ìë¬ ë문ì 무í 루íì ë¹ ì§ê² ë ë ëíëëë°, ë¸ë¼ì°ì ë ì¼ë¿ ì°½ì íµí´ ì¬ì©ììê² íì´ì§ ì ì²´ì í¨ê» í´ë¹ íì¤í¬ë¥¼ ì·¨ììí¬ì§ ë§ì§ë¥¼ ì ííëë¡ ì ëí©ëë¤.
ì, ì´ë¡ ì ì¶©ë¶í ì´í´ë´¤ì¼ë ì§ê¸ë¶í´ ì´ ì§ìì ì¤ë¬´ìì ì´ë»ê² íì©í ì ììì§ ììë³´ëë¡ í©ìë¤.
ì ì¤ ì¼ì´ì¤ 1: CPU ìëª¨ê° ë§ì íì¤í¬ 쪼ê°ê¸°
CPU ìëª¨ê° ì주 ë§ì íì¤í¬ íëê° ìë¤ê³ ê°ì í´ ë´ ìë¤.
íê´íì ì¹ í ê²ì²ë¼ íì´ì§ ì¼ë¶ë¥¼ ê°ì¡°í´ 주ë ê²ì´ ë°ë¡ ì´ë° íì¤í¬ì ìí©ëë¤. íí 리ì¼ì ì ë°ë¼ì¤ì ¨ë¤ë©´ ìì 곳곳ìì ì´ë° 기ë¥ì´ ì¬ì©ëê³ ìë¤ë ê²ì ëì¹ì±ì ¨ì ê²ëë¤. ì´ë ê² ì½ë ì¼ë¶ë¥¼ ê°ì¡°í기 ìí´ì ì´ë¤ ë¶ë¶ì ê°ì¡°í´ì¼ í ì§ì ëí ì¬ì ë¶ìì´ íìí©ëë¤. ì¬ê¸°ì ëíì¬ ìì ë³ê²½í ìì를 ìë¡ê² ë§ë¤ê³ , ìë¡ ë§ë ììë¤ì 문ìì ì¶ê°í´ì¼ íë ì¼ë ¨ì ìì ì´ íìíì£ . ê°ì¡°í´ì¼ í ì½ë ìì´ ë§ë¤ë©´ ë¹ì°í ì주 긴 ìê°ì´ ì모ë ê²ëë¤.
ì½ë ê°ì¡°ë¼ë íì¤í¬ë¥¼ ìííëë¼ ìì§ì´ ë°ì ëì ì¬ì©ì ì´ë²¤í¸ ì²ë¦¬ë DOM ê´ë ¨ ìì ì´ ìì í ë©ì¶ê² ë©ëë¤. ê·¸ë¬ë¤ ë³´ë©´ ë¸ë¼ì°ì ì 'ì§ì°âì´ ì기거ë ì¬íë©´ âë©ì¶¤â íìê¹ì§ ë°ìí기ë íì£ . ì ë ìì´ìë ì ë ì¼ì ëë¤.
ì´ë° ë¶ê°í¼í ìí©ë¤ì íì¤í¬ë¥¼ ì¬ë¬ ì¡°ê°ì¼ë¡ ìª¼ê° ìë°©í ì ììµëë¤. ìë¶ë¶ 100ì¤ë§ 먼ì ê°ì¡°íê³ , ì§ì°ìê°ì´ 0ì¸ setTimeoutì ì¬ì©í´ ìë¡ê² ì¤ì¼ì¤ë§ì í ë¤ì, ê·¸ ë¤ì 100ì¤ì ê°ì¡°íë ìì¼ë¡ ì½ë를 ë³ê²½íë©´ ëì£ .
ì¤ì ì½ë를 íµí´ ì´ë»ê² íë©´ íì¤í¬ë¥¼ 쪼갤 ì ìëì§ ììë´
ìë¤. ì§ì ê°ì¡°ê¸°ë¥ì 구ííë ëì 1ë¶í° 1000000000ê¹ì§ì ì«ì를 ì¸ì£¼ë í¨ì를 ì¬ì©í´ ê°ê²°í ì½ëë¡ ìì°í´ ë³´ê² ìµëë¤.
먼ì 리í©í ë§ ì ì ì½ë를 ì´í´ë´ ìë¤. ìë ìì를 ì¤ííë©´ ìì§ì´ ëª ì´ê° âë©ì¶¥ëë¤â. ìë² ì¬ì´ë íê²½ìì ìì를 ì¤ííë©´ ë©ì¶¤ íìì´ ëì ì ëëë°, ì§ê¸ì ë¸ë¼ì°ì ììì ìì를 ì¤ííê³ ì기 ë문ì ì¤í í íì´ì§ ë´ì ìë ì무 ë²í¼ì´ë í´ë¦í´ ì§ì°ì´ ë°ìíë ê²ì ì§ì íì¸í´ ë³´ëë¡ í©ìë¤(ë§ì°ì¤ ì¤ë¥¸ìª½ ë²í¼ì ë르면 ì½ê² ì´ë²¤í¸ ì§ì°ì íì¸í ì ììµëë¤ â ì®ê¸´ì´). ì«ì ì¹´ì´í ì´ ëëê³ ì¼ë¿ ì°½ì´ ë¨ê¸° ì ê¹ì§ ê·¸ ì´ë¤ ì¬ì©ì ì´ë²¤í¸ë ì²ë¦¬ëì§ ìë ê²ì íì¸í ì ììµëë¤.
let i = 0;
let start = Date.now();
function count() {
// CPU ìëª¨ê° ë§ì ë¬´ê±°ì´ ìì
ì ìí
for (let j = 0; j < 1e9; j++) {
i++;
}
alert("ì²ë¦¬ì 걸린 ìê°: " + (Date.now() - start) + "ms");
}
count();
ì ì¬ì 머ì ì´ë¼ë©´ ë¸ë¼ì°ì ì 'the script takes too longâë¼ë ê²½ê³ ê° ë° ìë ìê² ë¤ì.
ì, ì´ì ì¤ì²© setTimeout í¸ì¶ì ì¬ì©í´ íì¤í¬ë¥¼ 쪼ê°ì 문ì 를 í´ê²°í´ ë´
ìë¤.
let i = 0;
let start = Date.now();
function count() {
// ë¬´ê±°ì´ ìì
ì ìª¼ê° í ì´ë¥¼ ìí (*)
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("ì²ë¦¬ì 걸린 ìê°: " + (Date.now() - start) + "ms");
} else {
setTimeout(count); // ìë¡ì´ í¸ì¶ì ì¤ì¼ì¤ë§ (**)
}
}
count();
ì´ì ì«ì를 ì¸ë ëì¤ìë ë¸ë¼ì°ì ê° ìì í ì 기ë¥ì ë¤ íë ê²ì íì¸í ì ììµëë¤.
ë©ì¶¤ ìì´ ë¸ë¼ì°ì ê° ëìí ì ììë ê²ì (*)ë¡ íìí do-while ë°ë³µìì count íì¤í¬ ì¼ë¶ê° ì²ë¦¬ëê³ , ì¹´ì´í
ì´ ë¤ ëëì§ ììë¤ë©´ (**)ë¡ íìí ì¤ìì ì¹´ì´í
íì¤í¬ê° ë¤ì ì¤ì¼ì¤ë§ ë기 ë문ì
ëë¤.
- 첫 ë²ì§¸ ë¶ë¶ ì¹´ì´í
:
i=1...1000000 - ë ë²ì§¸ ë¶ë¶ ì¹´ì´í
:
i=1000001..2000000 - ìíë ì«ì를 ë¤ ì ëê¹ì§ ë¶ë¶ ì¹´ì´í ì´ ì´ì´ì§
ìì§ì´ 첫 ë²ì§¸ ë¶ë¶ ì¹´ì´í
ì ì§ííëë¼ ë°ì ìì¤ì onclick ì´ë²¤í¸ì ê°ì ìë¡ì´ íì¤í¬ê° ì기면 íì¤í¬ë íì ë¤ì´ê°ëë¤. ì´ íì¤í¬ë 첫 ë²ì§¸ ë¶ë¶ ì¹´ì´í
ì´ ëëê³ ë í, ë ë²ì§¸ ë¶ë¶ ì¹´ì´í
ì´ ììë기 ì ì ì¤íë©ëë¤. ì´ë ê² ë¶ë¶ ì¹´ì´í
ì¤í ì¤ê° ì¤ê°ì 'í기â를 í´ ì¤ì ì´ë²¤í¸ 루íê° ëìê° ì ìê² í´ì£¼ë©´, ì¬ì©ì ì´ë²¤í¸ì ë°ìíë©´ì ë¬´ê±°ì´ íì¤í¬ ì²ë¦¬ê° ê°ë¥í´ì§ëë¤.
ê·¸ë°ë° setTimeoutì ì¬ì©í´ íì¤í¬ë¥¼ ìª¼ê° ììì ê·¸ ì ì ìì를 ë¹êµíë©´ í¬ì§ë ìì§ë§ ìê°ì°¨ê° ì´ë ì ë ìë ê²ì ë³¼ ì ììµëë¤.
ì½ë를 ë¤ë¬ì´ ìê°ì°¨ë¥¼ ì¤ì¬ë³´ëë¡ í©ìë¤.
ì¤ì¼ì¤ë§í´ì£¼ë ì½ë를 í¨ì count() ìë¶ë¶ì¼ë¡ ì®ê²¨ë³´ììµëë¤.
let i = 0;
let start = Date.now();
function count() {
// ì¤ì¼ì¤ë§ ì½ë를 í¨ì ìë¶ë¶ì¼ë¡ ì®ê¹
if (i < 1e9 - 1e6) {
setTimeout(count); // ìë¡ì´ í¸ì¶ì ì¤ì¼ì¤ë§í¨
}
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("ì²ë¦¬ì 걸린 ìê°: " + (Date.now() - start) + "ms");
}
}
count();
ì´ë ê² ì½ë를 ë³ê²½íë©´ count()ê° í¸ì¶ëê³ ìì§ ìíë ì«ì를 ë¤ ì¸ì§ 못í ê²½ì°, ë¶ë¶ ì¹´ì´í
ì´ ììë기 ì ì ë¶ë¶ ì¹´ì´í
ì¬ì¤ì¼ì¤ë§ì´ ì´ë¤ì§ê² ë©ëë¤.
ì§ì ì¤íí´ ë³´ë©´ ììê² ì§ë§ ìíë ëë¡ ìê°ì´ ë¨ì¶ëìë¤ì.
ê·¸ë ë¤ë©´ ìê°ì ì ë¨ì¶ë ê²ì¼ê¹ì?
ì´ì ë ë¨ìí©ëë¤. setTimeoutê³¼ setIntervalì ì´ì©í í¸ì¶ ì¤ì¼ì¤ë§ ì±í°ìì ë°°ì´ ë°ì ê°ì´ ì¤ì²© setTimeout í¸ì¶ì´ ë§ì ê²½ì°ì ë¸ë¼ì°ì ìµì ë기 ìê°ì´ 4ë°ë¦¬ì´ê° ë기 ë문ì
ëë¤. ì´ë° ë¸ë¼ì°ì ì¤í ë문ì ì½ëìì¼ë¡ ë기 ìê°ì´ 0ì´ëë¼ë ì¤ì ë기ìê°ì 4ms(í¹ì ê·¸ë³´ë¤ ì¡°ê¸ ë 긴 ìê°)ê° ëëë°, ì«ì를 ì¸ê¸° ì ì ì¤ì¼ì¤ë§íë©´ ì«ì를 ì¸ë©´ì ë기 ìê°ì ì모í ì ìì´ ì¤íì´ ë 빨ë¼ì§ê² ëë ê²ì
ëë¤.
ì´ë ê² CPU를 ë§ì´ ì¡ì먹ë íì¤í¬ë¥¼ ì¬ë¬ ê°ë¡ 쪼ê°ë©´, ì ì²´ ì¤í ìê°ì ë§ì´ í¬ìíì§ ìì¼ë©´ìë ì¬ì©ììì ìí¸ìì©ì ë§íì´ ìì´ì§ë¤ë ì¥ì ì´ ììµëë¤.
ì ì¤ ì¼ì´ì¤ 2: íë¡ê·¸ë ì¤ ë°
íì¤í¬ë¥¼ ì¬ë¬ ê°ë¡ 쪼갤 ëì ì¥ì ì ì§í ìí를 ëíë´ì£¼ë íë¡ê·¸ë ì¤ ë°(progress bar)를 ë§ë¤ ëë ëë¬ë©ëë¤.
ììë¤ìí¼ ë¸ë¼ì°ì ë ìê°ì´ ì¤ë 걸리ë ìëë ìê´ìì´ íì¬ ìì ì¤ì¸ íì¤í¬ê° ëëì¼ DOM ë³ê²½ë¶ì íë©´ì ë ëë§í´ì¤ëë¤.
ì´ë° ë¸ë¼ì°ì ëì ë°©ìì ìì±ëì§ ìì âì¤ê°â ìíì íë©´ì´ ì¬ì©ììê² ë ¸ì¶ëë 걸 ë§ì주기 ë문ì ì 리í©ëë¤. ìì를 ì¬ë¬ ê° ë§ë¤ê³ ì´ ììë¤ì íëì© íë©´ì ì¶ê°í ë¤ì ìíë ììì ì¤íì¼ì ë³ê²½ìí¤ë ì¼ë ¨ì ê³¼ì ì´ ë´ê¸´ í¨ìê° ìëë°, ì´ í¨ì를 ì¤ííë ëìì ë³ê²½ì¬í 모ëê° ì¬ì©ììê² ë ¸ì¶ëë¤ë©´ ì¬ì©ìë í¼ëì ëê¼ì ê²ëë¤.
ê´ë ¨ ë°ëª¨ë¥¼ ì´í´ë´
ìë¤. í¨ìê° ëë ëê¹ì§ ì¬ì©ìë iê° ë³íë ê²ì ë³¼ ì ììµëë¤. íë©´ì ë§ì§ë§ ìíë§ ì¶ë ¥ë©ëë¤.
<div id="progress"></div>
<script>
function count() {
for (let i = 0; i < 1e6; i++) {
i++;
progress.innerHTML = i;
}
}
count();
</script>
ê·¸ë°ë° ê°ë°ì íë¤ ë³´ë©´ íë¡ê·¸ë ì¤ ë° ê°ì´ ìì ì§ì² ìí를 ë³´ì¬ì£¼ë ì¸ëì¼ì´í°(indicator)를 ë§ë¤ì´ì¼ íë ê²½ì°ê° ì기곤 í©ëë¤.
ì´ë´ ë setTimeoutì ì¬ì©í´ íì¤í¬ë¥¼ ì¬ë¬ ê°ë¡ 쪼ê°ë©´, ìë¸ íì¤í¬ ì¤ê°ë§ë¤ ìí ë³í를 ë³¼ ì ììµëë¤.
ìì를 ì´í´ë´ ìë¤.
<div id="progress"></div>
<script>
let i = 0;
function count() {
// ë¬´ê±°ì´ ìì
ì ìª¼ê° í ì´ë¥¼ ìí
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e7) {
setTimeout(count);
}
}
count();
</script>
ì´ì íë¡ê·¸ë ì¤ ë°ì²ë¼ <div>ì iê° ë³íë ê³¼ì ì ì¶ë ¥í´ ì¤ ì ìê² ëììµëë¤.
ì ì¤ ì¼ì´ì¤ 3: ì´ë²¤í¸ ì²ë¦¬ê° ëë ì´íì ìì í기
ì´ë²¤í¸ í¸ë¤ë¬ë¥¼ ë§ë¤ë¤ ë³´ë©´ ì´ë²¤í¸ ë²ë¸ë§ì´ ëë 모ë DOM í¸ë¦¬ ë 벨ìì ì´ë²¤í¸ê° í¸ë¤ë§ ë ëê¹ì§ í¹ì ì¡ì
ì ì°ê¸°ìì¼ì¼ íë ê²½ì°ê° ì기곤 í©ëë¤. ì´ë´ ë ì°ê¸°ìí¬ ì¡ì
ê´ë ¨ ì½ë를 ì§ì° ìê°ì´ 0ì¸ setTimeoutì¼ë¡ ê°ì¸ë©´ ìíë ëìì 구íí ì ììµëë¤.
ìì 커ì¤í
ì´ë²¤í¸ ëì¤í¨ì¹ ì±í°ìì 커ì¤í
ì´ë²¤í¸ menu-openì setTimeout ììì ëì¤í¨ì¹íë ìì를 ì´í´ë³¸ ë° ììµëë¤. ì´ë ê² setTimeoutì ì¬ì©íë©´ âclickâ ì´ë²¤í¸ê° ìì í í¸ë¤ë§ ë ë¤ìì menu-open ì´ë²¤í¸ë¥¼ ëì¤í¨ì¹ í ì ììµëë¤.
menu.onclick = function() {
// ...
// í´ë¦í ë©ë´ ë´ í목 ì ë³´ê° ë´ê¸´ 커ì¤í
ì´ë²¤í¸ ìì±
let customEvent = new CustomEvent("menu-open", {
bubbles: true
});
// ë¹ëê¸°ë¡ ì»¤ì¤í
ì´ë²¤í¸ë¥¼ ëì¤í¨ì¹
setTimeout(() => menu.dispatchEvent(customEvent));
};
매í¬ë¡íì¤í¬ì ë§ì´í¬ë¡íì¤í¬
íì¤í¬ë ì´ë² ì±í°ìì ì¤ëª í 매í¬ë¡íì¤í¬(macrotask) ì ë§ì´í¬ë¡íì¤í¬ ì±í°ìì ë¤ë£¬ ë§ì´í¬ë¡íì¤í¬(microtask) ë¡ ëë©ëë¤.
ë§ì´í¬ë¡íì¤í¬ë ì½ë를 ì¬ì©í´ìë§ ë§ë¤ ì ìëë°, ì£¼ë¡ íë¼ë¯¸ì¤ë¥¼ ì¬ì©í´ ë§ëëë¤. íë¼ë¯¸ì¤ì í¨ê» ì°ì´ë .then/catch/finally í¸ë¤ë¬ê° ë§ì´í¬ë¡íì¤í¬ê° ëì£ . ì¬ê¸°ì ëíì¬ ë§ì´í¬ë¡íì¤í¬ë íë¼ë¯¸ì¤ë¥¼ í¸ë¤ë§íë ë ë¤ë¥¸ 문ë²ì¸ await를 ì¬ì©í´ ë§ë¤ê¸°ë í©ëë¤.
ì´ ì¸ìë íì¤ APIì¸ queueMicrotask(func)를 ì¬ì©íë©´ í¨ì func를 ë§ì´í¬ë¡íì¤í¬ íì ë£ì´ ì²ë¦¬í ì ììµëë¤.
ìë°ì¤í¬ë¦½í¸ ìì§ì 매í¬ë¡íì¤í¬ íë를 ì²ë¦¬í ëë§ë¤ ë ë¤ë¥¸ 매í¬ë¡íì¤í¬ë ë ëë§ ìì ì í기 ì ì ë§ì´í¬ë¡íì¤í¬ íì ìì¸ ë§ì´í¬ë¡íì¤í¬ ì ë¶ë¥¼ ì²ë¦¬í©ëë¤.
ìì를 ì´í´ë´ ìë¤.
setTimeout(() => alert("timeout"));
Promise.resolve()
.then(() => alert("promise"));
alert("code");
ì¼ë¿ ì°½ì ìë ììëë¡ ë¬¸ìì´ì´ ì¶ë ¥ë©ëë¤.
codeâ ì¼ë°ì ì¸ ë기 í¸ì¶ì´ë¯ë¡ ê°ì¥ 먼ì 매í¬ë¡íì¤í¬ íì ë¤ì´ê° í ì¤íë©ëë¤.promiseâ.thenì ë§ì´í¬ë¡íì¤í¬ íì ë¤ì´ê° ì²ë¦¬ë기 ë문ì, íì¬ ì½ë(alert("code"))ê° ì¤íëê³ ë íì ì¤íë©ëë¤.timeoutâsetTimeoutìì ì¤ì í ìê°ì´ ëë í ì½ë°± í¨ì를 ì¤ííë ê²ì 매í¬ë¡íì¤í¬ì´ê¸° ë문ì ê°ì¥ ë§ì§ë§ì ì¶ë ¥ë©ëë¤.
매í¬ë¡íì¤í¬ì ë§ì´í¬ë¡íì¤í¬ ì²ë¦¬ ë¡ì§ì 첨ê°íë©´ ììì ì´í´ë³¸ 그림ì ì¢ ë ê³ ëí í ì ììµëë¤. 그림ì ìììë¶í° ìëë¡ ë´ ìë¤. 매í¬ë¡íì¤í¬(script, mousemove, setTimeout ë±) íëê° ì²ë¦¬ëê³ ë í ë§ì´í¬ë¡íì¤í¬ ì ë¶(microtasks)ê° ì²ë¦¬ëê³ ê·¸ ì´í ë ëë§ì´ ì§íëë ê²ì íì¸í ì ììµëë¤.
ì´ì²ë¼ ë§ì´í¬ë¡íì¤í¬ë ë¤ë¥¸ ì´ë²¤í¸ í¸ë¤ë¬ë ë ëë§ ìì , í¹ì ë¤ë¥¸ 매í¬ë¡íì¤í¬ê° ì¤íë기 ì ì ì²ë¦¬ë©ëë¤.
ì´ë° ì²ë¦¬ììê° ì주 ì¤ìí ì´ì ë (ë§ì°ì¤ ì¢í ë³ê²½ì´ë ë¤í¸ìí¬ íµì ì ìí ë°ì´í° ë³ê²½ ê°ì´ ì í리ì¼ì´ì íê²½ì ë³í를 주ë ìì ì ìí¥ì ë°ì§ ìê³ ) 모ë ë§ì´í¬ë¡íì¤í¬ë¥¼ ëì¼í íê²½ìì ì²ë¦¬í ì ì기 ë문ì ëë¤.
ê·¸ë°ë° ê°ë°ì íë¤ ë³´ë©´ ì§ì ë§ë í¨ì를 íì¬ ì½ë ì¤íì´ ëë í, ìë¡ì´ ì´ë²¤í¸ í¸ë¤ë¬ê° ì²ë¦¬ë기 ì ì´ë©´ì ë ëë§ì´ ì¤íë기 ì ì ë¹ë기ì ì¼ë¡ ì¤íí´ì¼ íë ê²½ì°ê° ì기곤 í©ëë¤. ì´ë´ ë queueMicrotask를 ì¬ì©í´ 커ì¤í
í¨ì를 ì¤ì¼ì¤ë§íë©´ ë©ëë¤.
ìì ì´í´ë³¸ âíë¡ê·¸ë ì¤ ë°â ìììì setTimeout ëì queueMicrotask를 ì¬ì©í´ í¨ì count를 ì¬ì¤ì¼ì¤ë§í´ ë³´ììµëë¤. ìì를 ì¤ííë©´ ë기 ì½ëì²ë¼ ì¹´ì´í
ì´ ë¤ ëë¬ì ë ì«ìê° ë ëë§ ëë ê²ì íì¸í ì ììµëë¤.
<div id="progress"></div>
<script>
let i = 0;
function count() {
// ë¬´ê±°ì´ ìì
ì ìª¼ê° í ì´ë¥¼ ìí
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e6) {
queueMicrotask(count);
}
}
count();
</script>
ìì½
ì´ë²¤í¸ 루í ìê³ ë¦¬ì¦ì ìì½íë©´ ë¤ìê³¼ ê°ìµëë¤(ìì¸í ì¬íì ëª ì¸ììì íì¸í ì ììµëë¤).
- 매í¬ë¡íì¤í¬ íìì ê°ì¥ ì¤ëë íì¤í¬ë¥¼ êº¼ë´ ì¤íí©ëë¤(ì: ì¤í¬ë¦½í¸ë¥¼ ì¤í).
- 모ë ë§ì´í¬ë¡íì¤í¬ë¥¼ ì¤íí©ëë¤.
- ì´ ìì
ì ë§ì´í¬ë¡íì¤í¬ íê° ë¹ ëê¹ì§ ì´ì´ì§ê³
- íì¤í¬ë ì¤ëë ììëë¡ ì²ë¦¬ë©ëë¤.
- ì´ ìì
ì ë§ì´í¬ë¡íì¤í¬ íê° ë¹ ëê¹ì§ ì´ì´ì§ê³
- ë ëë§í ê²ì´ ìì¼ë©´ ì²ë¦¬í©ëë¤.
- 매í¬ë¡íì¤í¬ íê° ë¹ì´ìì¼ë©´ ìë¡ì´ 매í¬ë¡íì¤í¬ê° ëíë ëê¹ì§ 기ë¤ë¦½ëë¤.
- 1ë²ì¼ë¡ ëìê°ëë¤.
ìë¡ì´ 매í¬ë¡íì¤í¬ë¥¼ ì¤ì¼ì¤ë§íë ë°©ë²ì ë¤ìê³¼ ê°ìµëë¤.
- ì§ì°ìê°ì´ 0ì¸
setTimeout(f)ì¬ì©í기
ì´ ë°©ë²ì ì¬ì©íë©´ ê³ì°ì´ ë³µì¡í í° íì¤í¬ íë를 ì¬ë¬ ê°ë¡ 쪼갤 ì ììµëë¤. íì¤í¬ë¥¼ ì¬ë¬ ê°ë¡ 쪼ê°ë©´ íì¤í¬ ì¤ê°ì¤ê° ì¬ì©ì ì´ë²¤í¸ì ë°ìí ì ìê³ , ìì ì§ì² ìí를 íë©´ì íìí´ì¤ ìë ììµëë¤.
ì§ì°ìê°ì´ 0ì¸ setTimeoutì ì´ë²¤í¸ê° ìì í ì²ë¦¬ëê³ ë í(ë²ë¸ë§ì´ ëë í)ì í¹ì ìì
ì ìííëë¡ ì¤ì¼ì¤ë§í ëë ì¬ì©ë©ëë¤.
ìë¡ì´ ë§ì´í¬ë¡íì¤í¬ë¥¼ ì¤ì¼ì¤ë§íë ë°©ë²ì ë¤ìê³¼ ê°ìµëë¤.
queueMicrotask(f)ì¬ì©í기- ì´ì¸ìë íë¼ë¯¸ì¤ í¸ë¤ë¬ë ë§ì´í¬ë¡íì¤í¬ íì ë¤ì´ê° ì²ë¦¬ë©ëë¤.
ë§ì´í¬ë¡íì¤í¬ ì ì²´ê° ì²ë¦¬ëë ëììë UI ë³íë ë¤í¸ìí¬ ì´ë²¤í¸ í¸ë¤ë§ì´ ì¼ì´ëì§ ììµëë¤. ë ëë§ì´ë ë¤í¸ìí¬ ìì² ë±ì ìì ë¤ì ë§ì´í¬ë¡íì¤í¬ ì ë¶ê° ì²ë¦¬ëê³ ë ì§í ì²ë¦¬ë©ëë¤.
ì´ë° ì²ë¦¬ ìì ëë¶ì queueMicrotask를 ì¬ì©í´ í¨ì를 ë¹ë기ì ì¼ë¡ ì²ë¦¬í ë ì í리ì¼ì´ì
ìíì ì¼ê´ì±ì´ ë³´ì¥ë©ëë¤.
ì´ë²¤í¸ 루í를 ë§ì ì°ë ¤ê° ìë ë¬´ê±°ì´ ì°ì°ì ì¹ ì커(Web Worker)를 ì¬ì©í´ ì²ë¦¬í ì ììµëë¤.
ì¹ ì커를 ì¬ì©íë©´ ë³ëì 백그ë¼ì´ë ì¤ë ëìì ì½ë를 ë³ë ¬ì ì¼ë¡ ì¤íí ì ììµëë¤.
ë©ì¸ ì¤ë ëì ë©ìì§ë¥¼ êµíí ì ì긴 íì§ë§ ì¹ ì커ì ë©ì¸ ì¤ë ëì ì°ê´ ìë ê³ ì í ë³ìë¤ê³¼ ìì²´ ì´ë²¤í¸ 루íê° ììµëë¤.
ì¹ ì커ë DOMì ì ê·¼í ì ì기 ë문ì ì¬ë¬ CPU ì½ì´ë¥¼ ëìì ì¬ì©í´ì¼ íë ì°ì°ì ì£¼ë¡ ì¬ì©í©ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.