원래 질문은 2011 년에 제기되었습니다. 그 이후로 Node.js의 등장으로 인해 문제를 다시 검토 할 가치가 있다고 생각했습니다. 서버 환경에서 몇 밀리 초 정도면 여기에서 많은 문제가 발생할 수 있습니다. 부하가있는 상태에서 반응성이 유지되는 것과 그렇지 않은 것간에 차이가있을 수 있습니다.
내부 기능이 개념적으로 훌륭하지만 JavaScript 엔진의 코드 최적화 프로그램에 문제가 발생할 수 있습니다. 다음의 예는 이것을 설명 :
function a1(n) {
return n + 2;
}
function a2(n) {
return 2 - n;
}
function a() {
var k = 5;
for (var i = 0; i < 100000000; i++) {
k = a1(k) + a2(k);
}
return k;
}
function b() {
function b1(n) {
return n + 2;
}
function b2(n) {
return 2 - n;
}
var k = 5;
for (var i = 0; i < 100000000; i++) {
k = b1(k) + b2(k);
}
return k;
}
function measure(label, fn) {
var s = new Date();
var r = fn();
var e = new Date();
console.log(label, e - s);
}
for (var i = 0; i < 4; i++) {
measure('A', a);
measure('B', b);
}
코드를 실행하기위한 명령을
node --trace_deopt test.js
출력 : 당신이 볼 수 있듯이
[deoptimize global object @ 0x2431b35106e9]
A 128
B 130
A 132
[deoptimizing (DEOPT eager): begin 0x3ee3d709a821 b (opt #5) @4, FP to SP delta: 72]
translating b => node=36, height=32
0x7fffb88a9960: [top + 64] <- 0x2431b3504121 ; rdi 0x2431b3504121 <undefined>
0x7fffb88a9958: [top + 56] <- 0x17210dea8376 ; caller's pc
0x7fffb88a9950: [top + 48] <- 0x7fffb88a9998 ; caller's fp
0x7fffb88a9948: [top + 40] <- 0x3ee3d709a709; context
0x7fffb88a9940: [top + 32] <- 0x3ee3d709a821; function
0x7fffb88a9938: [top + 24] <- 0x3ee3d70efa71 ; rcx 0x3ee3d70efa71 <JS Function b1 (SharedFunctionInfo 0x361602434ae1)>
0x7fffb88a9930: [top + 16] <- 0x3ee3d70efab9 ; rdx 0x3ee3d70efab9 <JS Function b2 (SharedFunctionInfo 0x361602434b71)>
0x7fffb88a9928: [top + 8] <- 5 ; rbx (smi)
0x7fffb88a9920: [top + 0] <- 0 ; rax (smi)
[deoptimizing (eager): end 0x3ee3d709a821 b @4 => node=36, pc=0x17210dec9129, state=NO_REGISTERS, alignment=no padding, took 0.203 ms]
[removing optimized code for: b]
B 1000
A 125
B 1032
A 132
B 1033
이 기능 A와 B가 동일한에서 실행 속도. 그런 다음 어떤 이유로 인해 최적화 해제 이벤트가 발생했습니다. 그때부터 B는 거의 한 단계 더 느려집니다.
성능이 중요한 코드를 작성하는 경우 내부 기능을 피하는 것이 가장 좋습니다.
. 하지만 다른 고려 사항도 있습니다.이 예제에서 내부에있는 함수로 작성한 클로저는 매우 중요합니다. 매개 변수로 전달하거나 무언가를 다시 처리하지 않고도 다른 모든 로컬 변수를 캡슐화 할 수 있습니다. – davin