Range


[안느긋한 range]

var add = (a, b) => a + b;

const range = l => {
  let i = -1;
  let res = [];
  while (++i < l) {
    res.push(i);
  }
  return res;
};

var list = range(4);
log(list); // [0, 1, 2, 3]
log(reduce(add, list)); // 6

[느긋한 L.range]

const L = {};

L.range = function* (l) {
  let i = -1;
  while (++i < l) {
    yield i;
  }
};

var list = L.range(4);
log(list); 
// GeneratorFunctionPrototype {_invoke: function invoke(), constructor: Object...
// 이터레이터 (제너레이터 객체)가 반환됨
log(reduce(add, list)); // 6 // 이 list 역시 이터러블이라서 결과 도출됨

[두 range 비교]

const range = l => {
  let i = -1;
  let res = [];
  while (++i < l) {
		log('range', i)
    res.push(i);
  }
  return res;
};

var list = range(4);

L.range = function* (l) {
	log('hi')
  let i = -1;
  while (++i < l) {
		log('LRange', i);
    yield i;
  }
};

var list = L.range(4);

// 위의 range는 실행과 즉시 배열로 평가가 되었다

// range 0
// range 1
// range 2
// range 3

// hi는 출력되지 않음

// 아래 range는 next() 가 될때 (조회가 될때) 평가가 된다
// 바로 평가되지 않고 필요할 때까지 기다렸다가 평가가 된다

log(list.next().value); // LRange 0
log(list.next().value); // LRange 1

range 함수가 호출된 시점

[테스트]

function test(name, time, f) {
  console.time(name);
  while (time--) f();
  console.timeEnd(name);
}

test('range', 10, () => reduce(add, range(1000000)));

test('L.range', 10, () => reduce(add, L.range(1000000)));
console.clear();

// L.range가 더빠르다

Take