케티님의 예시를 구현한다면, 아래의 코드에서 `hardWork1()`, `hardWork2()` 와 같은 형태가 되겠습니다만, 보통은 반복회수를 결정하는 비교구문에서 `hardWork3()` 처럼 쓰는게 보통이고, `array.length`의 접근속도가 문제되던 시절에는 그게 권장되기도 하였으나, 현재는 실험에서 보시는 것처럼(`hardWork4()`) 엔진에서 최적화를 해주어서 문제가 없습니다.
자바스크립트에 한하여서는 시대가 바뀌었으니 해당지적은 이제 잊으셔도 될듯합니다..
function getSize(ary) {
return Math.floor(ary.length + Math.random())
}
function timeCheck(messge, func) {
let startTime = performance.now()
let ret = func()
let executeTime = performance.now() - startTime
console.log(ret)
console.log(messge, executeTime)
}
function hardWork1(ary) {
for (let i = 0; i < getSize(ary); i++) {
ary[i] = i
}
return ary[Math.floor(Math.random() * getSize(ary))]
}
function hardWork2(ary) {
for (let i = getSize(ary) - 1; i >= 0; i--) {
ary[i] = i
}
return ary[Math.floor(Math.random() * getSize(ary))]
}
function hardWork3(ary) {
let len = getSize(ary)
for (let i = 0; i < len; i++) {
ary[i] = i
}
return ary[Math.floor(Math.random() * getSize(ary))]
}
function hardWork4(ary) {
for (let i = 0; i < ary.length; i++) {
ary[i] = i
}
return ary[Math.floor(Math.random() * getSize(ary))]
}
let arySize = 1000 * 1000 * 20
ary = new Array(arySize).fill(1)
timeCheck('for (let i = 0; i < getSize(ary); i++) {', () => hardWork1(ary))
timeCheck('for (let i = getSize(ary) - 1; i >= 0; i--) {', () => hardWork2(ary))
timeCheck('let len = getSize(ary);for (let i = 0; i < len; i++) {', () => hardWork3(ary))
timeCheck('for (let i = 0; i < ary.length; i++) {',() => hardWork4(ary))
VM226:10 for (let i = 0; i < getSize(ary); i++) { 576.4900000067428
VM226:10 for (let i = getSize(ary) - 1; i >= 0; i--) { 35.12000001501292
VM226:10 let len = getSize(ary);for (let i = 0; i < len; i++) { 28.960000025108457
VM226:10 for (let i = 0; i < ary.length; i++) { 26.425000047311187