performance.now()
사용//예시 1
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
//예시1 코드 실행 시간
let t1 = performance.now();
addUpTo(1000000000);
let t2 = performance.now();
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds.`)
//Time Elapsed: 1.088699999988079 seconds.
//예시2
function addUpTo(n) {
return n * (n + 1) / 2;
}
//예시2 코드 실행 시간
let t1 = performance.now();
addUpTo(1000000000);
let t2 = performance.now();
console.log(`Time Elapsed: ${(t2 - t1) / 1000} seconds.`)
//Time Elapsed: 0.00009999999403953553 seconds.
=> 빅오 표기법이 필요!!
//예시 1
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
//반복문...=> 많은 연산 갯수...
//예시2
function addUpTo(n) {
return n * (n + 1) / 2;
}
//곱셉 한개, 덧셈 한개, 나눗셈 한개 => 연산 3개
=> 예시1은 n에 따라 연산 시간이 다르지만, 예시2는 n과 상관없이 연산이 항상 3개이므로 시간이 거의같다.
=> 성능으로 보면 예시1과 예시2의 알고리즘이 굉장히 다르다는 것을 볼수 있다.
입력된 내용이 늘어날 수록 알고리즘에 실행시간이 어떻게 변하는지 설명하는 공식적인 방식
Big O는 어떤 함수의 입력값이 늘어나는 것과 함수의 실행 시간이 변하는 관계를 의미
f(n) could be linear (f(n) = n)
//O(n) 예시
function addUpTo(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
f(n) could be quadratic (f(n) = n^2)
f(n) could be constant (f(n) = 1)
// O(1) 예시
function addUpTo(n) {
return n * (n + 1) / 2;
}
function logAtLeast5(n) {
for (var i = 1; i <= Math.max(5, n); i++) {
console.log(i);
}
}
//logAtLeast5(10) => console.log(i) 10번
//logAtLeast5(1) => console.log(i) 5번
//logAtLeast5(3) => console.log(i) 5번
//반복문이 있어도, 결국 5까지 가거나, n까지 반복
//=> n이 커지면 실행시간은? n=100만이면 반복문도 100만번 반복
//=> 따라서 5는 중요하지 않다. n이 커질수록 연산갯수가 n에 비례해서 늘어난다.
function logAtMost5(n) {
for (var i = 1; i <= Math.min(5, n); i++) {
console.log(i);
}
}
//n이 커져도 아무 영향을 주지 않는다.