비교할 문제

함수 호출 방식별 속도 비교에서 확인할 질문은 일반 함수, arrow function과 bound function의 호출 비용은 실제 병목인가입니다. 세 후보가 같은 숫자 결과와 this 의미를 제공하는 경우만 비교합니다. 문법 선택으로 의미가 달라지면 성능 후보가 아닙니다. 결과값, 순서, 오류 처리와 부수 효과가 다르면 같은 성능 비교가 아닙니다. 먼저 두 후보가 같은 일을 하는지 작은 입력으로 확인합니다.

원인 분석과 재현

일반 함수, arrow와 bound 함수는 this·constructor 의미가 달라 동일 계약일 때만 호출 비용을 비교할 수 있습니다.

호출 100회·10만 회, 같은 argument 형태와 polymorphic input을 나누고 browser·Node version별로 측정합니다. runtime version, 운영체제, CPU와 memory 제한도 결과와 함께 기록합니다.

비교 질문은 일반 함수, arrow function과 bound function의 호출 비용은 실제 병목인가입니다.

후보 유리한 조건 함께 치르는 비용
일반 함수 동적 this나 prototype method가 필요 호출 문맥에 따라 this가 달라질 수 있음
arrow function lexical this와 callback constructor로 사용할 수 없음
bound function receiver·일부 인자를 고정 새 function object와 별도 호출 경계
function add(left, right) { return left + right; }
const arrow = (left, right) => left + right;
const addOne = add.bind(null, 1);
const cases = {
  direct() { let sum = 0; for (let i = 0; i < 100_000; i += 1) sum += add(i, 1); return sum; },
  arrow() { let sum = 0; for (let i = 0; i < 100_000; i += 1) sum += arrow(i, 1); return sum; },
  bound() { let sum = 0; for (let i = 0; i < 100_000; i += 1) sum += addOne(i); return sum; },
};
for (const fn of Object.values(cases)) for (let i = 0; i < 20; i += 1) fn(); // warm-up
for (const [name, fn] of Object.entries(cases)) {
  const samples = []; let checksum = 0;
  for (let run = 0; run < 30; run += 1) {
    const start = performance.now(); checksum ^= fn(); samples.push(performance.now() - start);
  }
  samples.sort((a, b) => a - b);
  console.log(name, { median: samples[15], p95: samples[28], checksum });
}

해결 방안과 판정

warm-up과 측정 구간을 나누고 여러 번 반복합니다. 서비스 지연은 median과 p95를, 처리량 비교는 단위 시간당 완료 수와 오류율을 함께 기록합니다. CPU time, allocation, RSS·heap, GC, I/O 중 이 작업에 직접 관련된 지표만 선택합니다. 현대 JIT는 단순 호출을 inline할 수 있어 문법만으로 고정 순위를 만들 수 없습니다. profile에서 호출이 실제 hot path일 때만 지원 runtime으로 재측정합니다.

차이가 반복 실행의 흔들림보다 작다면 더 단순하고 읽기 쉬운 구현을 선택합니다. 차이가 충분히 크더라도 실제 요청 전체의 지연과 자원 사용이 개선되는지 확인한 뒤 적용합니다.

공식 문서와 적용 범위

문서의 기본값과 동작은 version에 따라 달라질 수 있습니다. 현재 runtime·framework version, 실제 입력과 요청 흐름에서 다시 확인합니다.