Udemy 'JavaScript 알고리즘 & 자료구조 마스터클래스' 강좌를 바탕으로 작성한 글입니다.
같은 기능을 구현하는데도 여러 가지 접근 방법이 있다.
무엇이 최선인지 , 코드의 성능(performance)을 비교하는 방법 , 코드의 성능에 대해 정확한 어휘로 말할 수 있는 것이 중요하다.
코드가 느리거나 충돌할 때 , 문제가 발생할 수 있는 부분을 찾아내는 데 유용하다!
더 좋은 코드는 무엇인가 ?
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
console.time('test');
console.log(addUpTo(10000000000));
console.timeEnd('test');
//50000000000067860000
//test: 7.596s
function addUpTo(n) {
return (n * (n + 1)) / 2;
}
console.time('test');
console.log(addUpTo(10000000000));
console.timeEnd('test');
//50000000005000000000
//test: 3.998ms
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
let t1 = performance.now();
console.log(addUpTo(1000000000));
let t2 = performance.now();
console.log(`Time Elapsed: ${(t2-t1) / 1000} seconds.`)
//50000000000067860000
//Time Elapsed: 7.5107000000001864 seconds.
function addUpTo(n) {
return (n * (n + 1)) / 2;
}
let t1 = performance.now();
console.log(addUpTo(10000000000));
let t2 = performance.now();
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds.`);
//50000000005000000000
//Time Elapsed: 0.00009999999962747097 seconds.
시간의 문제
코드에 타이밍을 설정해보지 않더라도, 시간복잡도와 같은 효율성을 이해할 수 있는 방법이 있다.
Performance Tracker로 각 알고리즘의 시간복잡도를 시각화하여 확인해볼 수 있다. > Performance Tracker
BigO는 입력이 증가할 때마다 알고리즘의 런타임이 어떻게 증가하는지에 대하여 형식적으로 설명할 수 있게 해준다. 디테일은 신경 쓰지 않고 오직 광범위한 경향만 본다.
Time complexity
Space Complexity
The logarithm of a number roughly measures the number of times you can divide that number by 2 before you get a value that's less than or equal to one.
: 로그는 어떤 숫자에 대하여 2로 나누면서 1이하의 값을 얻게 될때까지 걸리는 횟수를 대략적으로 측정한 숫자를 의미한다.
로그는 언제 사용하나 ?