Time slicing

hongยท2026๋…„ 4์›” 9์ผ

javascript

๋ชฉ๋ก ๋ณด๊ธฐ
9/12
post-thumbnail

Time slicing ๊ณต๋ถ€ ๐Ÿ“–

ํฐ ๋ Œ๋”๋ง ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ๋๊นŒ์ง€ ๋ชฐ์•„์„œ ํ•˜์ง€ ์•Š๊ณ , ์ž˜๊ฒŒ ๋‚˜๋ˆ ์„œ ์กฐ๊ธˆ์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹.

์˜ˆ๋ฅผ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€

๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง
์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๋ฅธ ์ž…๋ ฅ์— ๋ฐ˜์‘ํ•˜๊ธฐ
์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค ํ•  ๋•Œ ๋ฐ˜์‘ํ•˜๊ธฐ
์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฆฌ๊ธฐ

์ด๋ ‡๊ฒŒ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ฅผ ํ•œ ๋ฒˆ์— ์ญ‰ ํ•˜๋ฉด ๊ทธ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ๋ชปํ•ด์„œ ๋ฒ„๋ฒ…์ž„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋ ‡๊ฒŒ :

์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•จ
๊ทผ๋ฐ ์ง€๊ธˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด๊ฑฐ์šด ๋ Œ๋” ์ž‘์—… ์ค‘
ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ๋ฐ”๋กœ ์‹คํ–‰ ๋ชปํ•จ
์ž…๋ ฅ์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋А๊ปด์ง

๊ทธ๋ž˜์„œ time slicing์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค :

๋ Œ๋”๋ง ์ž‘์—… ์กฐ๊ธˆ ํ•จ
์ค‘๊ฐ„์— ์ž ๊น ๋ฉˆ์ถค
๊ทธ ์‚ฌ์ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํด๋ฆญ/์Šคํฌ๋กค/ํ™”๋ฉด ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ
๋‹ค์‹œ ๋ Œ๋”๋ง ์ด์–ด์„œ ํ•จ

์ฆ‰ ๊ธด ์ž‘์—…์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ง‰์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ.

time slicing์„ ์ง์ ‘ api์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฐœ๋…๋ณด๋‹ค๋Š” concurrent rendering์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹/ํŠน์„ฑ์œผ๋กœ ์ดํ•ดํ•˜๋Š”๊ฒŒ ๋” ๋งž๋‹ค.

์ฆ‰ time slicing์€ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง์„ ์ชผ๊ฐœ์„œ ์ค‘๊ฐ„์— ์–‘๋ณดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์•„์ด๋””์–ด/๋ฐฉ์‹์ด๊ณ , concurrent rendering์€ ๊ทธ๊ฑธ ํฌํ•จํ•ด์„œ ๋ฆฌ์•กํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ ˆํ•˜๊ณ , ์ค‘๊ฐ„์— ๋ฉˆ์ท„๋‹ค๊ฐ€ ๋ฒ„๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋” ํฐ ๋ Œ๋”๋ง ๋ชจ๋ธ์ด๋‹ค.

์ •๋ฆฌํ•˜๋ฉด,

Time slicing : concurrent rendering์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ค‘์š”ํ•œ ์„ฑ์งˆ ์ค‘ ํ•˜๋‚˜
Concurrent rendering : time slicing ๋ณด๋‹ค๋Š” ํฐ ๊ฐœ๋… (time slicing์„ ํฌํ•จํ•œ ์ƒ์œ„ ๋ Œ๋”๋ง ๋ชจ๋ธ)

Time slicing์€ concurrent rendering๊ณผ ๋‹ฌ๋ฆฌ ๋ฆฌ์•กํŠธ ์ „์šฉ ์šฉ์–ด๋Š” ์•„๋‹ˆ๋‹ค.

๊ธด ์ž‘์—…์„ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ž‘์—…์ด ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ง์ด๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธด js ์ž‘์—…์„ ์ชผ๊ฐœ์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ CPU ์ž‘์—…์„ ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, UI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์กฐ๊ธˆ์”ฉ ๋‚˜๋ˆ ์„œ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ํฌํ•จํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด setTimeout๋„ time slicing ๊ตฌํ˜„ ์ˆ˜๋‹จ ์ค‘ ํ•˜๋‚˜์ธ๊ฐ€?

๋งž๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” setTimeout์„ ์‚ฌ์šฉํ•ด time slicing์„ ๊ตฌํ˜„ํ•œ ์‚ฌ๋ก€๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

const items = Array.from({ length: 10000 }, (_, i) => i + 1);
let index = 0;
const chunkSize = 100;

function processChunk() {
  const end = Math.min(index + chunkSize, items.length);

  for (let i = index; i < end; i++) {
    console.log('์ฒ˜๋ฆฌ์ค‘:', items[i]);
  }

  index = end;

  if (index < items.length) {
    setTimeout(processChunk, 0);
  } else {
    console.log('๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ');
  }
}

processChunk();

10000๊ฐœ๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค ๋Œ๋ฆฌ์ง€ ์•Š๊ณ , 100๊ฐœ์”ฉ ๋Š์–ด์„œ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ๋‹ค์Œ ํƒœ์Šคํฌ๋กœ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹.
๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ค‘๊ฐ„์— ํด๋ฆญ, ์Šคํฌ๋กค, ํ™”๋ฉด ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๊ธฐํšŒ๋ฅผ ์–ป๋Š”๋‹ค.

setTimeout ๋ง๊ณ ๋„, requestAnimationFrame, requestIdleCallback, MessageChannel ๋“ฑ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

requestAnimationFrame

๋‹ค์Œ ํ™”๋ฉด ๊ทธ๋ฆฌ๊ธฐ ์ง์ „์— ์ด ํ•จ์ˆ˜ ์‹คํ–‰ํ• ๊ฒŒ, ํ•˜๊ณ  ์˜ˆ์•ฝํ•ด์ฃผ๋Š” api

const items = Array.from({ length: 5000 }, (_, i) => i + 1); //1๋ถ€ํ„ฐ 5000๊นŒ์ง€ ์ž‘์—… ๋ชฉ๋ก ์ƒ์„ฑ
let index = 0; //์ง€๊ธˆ ์–ด๋””๊นŒ์ง€ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
const chunkSize = 100; //ํ•œ ๋ฒˆ์— ๋ช‡ ๊ฐœ์”ฉ ์ฒ˜๋ฆฌํ• ์ง€ 

function processChunk() {
  const end = Math.min(index + chunkSize, items.length);

  for (let i = index; i < end; i++) {
    console.log('์ฒ˜๋ฆฌ์ค‘:', items[i]);
  }

  index = end;

  if (index < items.length) {
    requestAnimationFrame(processChunk); //์•„์ง ์ฒ˜๋ฆฌํ•  ๊ฒŒ ๋‚จ์•„์žˆ์œผ๋ฉด ๋‹ค์Œ ํ”„๋ ˆ์ž„ ์ง์ „์— processChunk ์‹คํ–‰ ์˜ˆ์•ฝ
  }
}

requestAnimationFrame(processChunk); //์ฒซ ์‹œ์ž‘

requestIdleCallback

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ๊ฐ€ํ•ด์ง€๋ฉด (idle period, ํ•œ๊ฐ€ํ•œ ์‹œ๊ฐ„) ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € api

const items = Array.from({ length: 5000 }, (_, i) => i + 1); //1๋ถ€ํ„ฐ 5000๊นŒ์ง€ ์ž‘์—… ๋ชฉ๋ก ์ƒ์„ฑ
let index = 0; //์ง€๊ธˆ ์–ด๋””๊นŒ์ง€ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
const chunkSize = 100; //ํ•œ ๋ฒˆ์— ๋ช‡ ๊ฐœ์”ฉ ์ฒ˜๋ฆฌํ• ์ง€ 

function processChunk() {
  const end = Math.min(index + chunkSize, items.length);

  for (let i = index; i < end; i++) {
    console.log('์ฒ˜๋ฆฌ์ค‘:', items[i]);
  }

  index = end;

  if (index < items.length) {
    requestIdleCallback(processChunk, { timeout: 1000 });  //์•„์ง ์ฒ˜๋ฆฌํ•  ๊ฒŒ ๋‚จ์•„์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ๊ฐ€ํ•  ๋•Œ processChunk ์‹คํ–‰
  }
}

requestIdleCallback(processChunk, { timeout: 1000 }); //์ฒซ ์‹œ์ž‘ (* timeout : 1000 : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ”๋น ๋„ 1์ดˆ ์•ˆ์—๋Š” ์‹คํ–‰ ์˜ต์…˜ )

MessageChannel

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ˆ์—์„œ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ํ†ต๋กœ 2๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” api

const items = Array.from({ length: 10000 }, (_, i) => i + 1); //๋ฐ์ดํ„ฐ 10000๊ฐœ ์ค€๋น„
let index = 0; //์ง€๊ธˆ ์–ด๋””๊นŒ์ง€ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
const chunkSize = 100; //ํ•œ ๋ฒˆ์— ๋ช‡ ๊ฐœ์”ฉ ์ฒ˜๋ฆฌํ• ์ง€ 

const channel = new MessageChannel(); //ํ†ต๋กœ 2๊ฐœ ์ƒ์„ฑ
channel.port1.onmessage = processChunk; //port1์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด processChunk ์‹คํ–‰

function processChunk() {
  const end = Math.min(index + chunkSize, items.length);

  for (let i = index; i < end; i++) {
    console.log('์ฒ˜๋ฆฌ์ค‘:', items[i]); //index๋ถ€ํ„ฐ end -1 ๊นŒ์ง€ ๋Œ๋ฉด์„œ ์•„์ดํ…œ ์ฒ˜๋ฆฌ
  }

  index = end;

  if (index < items.length) {
    channel.port2.postMessage(null); //์•„์ง ์ฒ˜๋ฆฌํ•  ๊ฒŒ ๋‚จ์•„์žˆ์œผ๋ฉด, port2๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์„œ ๋‹ค์Œ chunk ์‹คํ–‰์„ ์˜ˆ์•ฝ
  }
}

channel.port2.postMessage(null); //์ฒซ ์‹œ์ž‘ 

๊ตฌ๋ถ„ํ•˜์ž๋ฉด

Time slicing : ์ž‘์—…์„ ์ž˜๊ฒŒ ๋‚˜๋ˆ  ์ฒ˜๋ฆฌํ•˜๋Š” ์„ฑ์งˆ
Concurrent rendering : ๋ฆฌ์•กํŠธ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ณด๊ณ  ๋ Œ๋”๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
startTransition / useTransition : ๊ธ‰ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋’ค๋กœ ๋ฏธ๋ฃจ๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ
useDeferredValue : ๋ฌด๊ฑฐ์šด ๊ฐ’ ๋ฐ˜์˜์„ ์กฐ๊ธˆ ๋Šฆ์ถ”๋Š” ๋„๊ตฌ

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค โŒจ๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€