рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреВрд▓рди

рдирдорд╕реНрдХрд╛рд░ рдкрд╛рдардХред

рдХрднреА-рдХрднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд░рд┐рдХрд░реНрд╕рд┐рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рдореИрдВ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред
рдЕрдзрд┐рдХрддрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рдЖрдк 10,000 рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдкрд░ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рджреБрднрд╛рд╖рд┐рдП рдЕрдзрд┐рдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЗ рд▓рд┐рдП 100,000 рдХреЙрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИрдВред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ рдЬреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ ("рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрдХреВрд▓рди") рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рддрдХ рд╣рд░ рдЬрдЧрд╣ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
function sum(n) { return n === 0 ? 0 : n + sum(n - 1) } sum(5) // 1 + 2 + 3 + 4 + 5 = 15 sum(100000) // Error: Maximum call stack size exceeded. 


рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ES6 рдорд╛рдирдХ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ ред

рдПрдХ рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 function sum(number, s = 0){ return number === 0 ? s : sum(number - 1, s + number) } 

рд▓реЗрдХрд┐рди, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ - рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛред рд╣рдо Trampolining рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди (рдЕрдЧрд▓рд╛ рдЪрд░рдг) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЙрд▓ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдмрдврд╝рд╛рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд▓реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред
 function trampoline(fn) { return function(...args) { let result = fn.apply(fn.context, args) while (typeof result === 'function') { result = result() } return result } } 


рдЕрдм рд╣рдорд╛рд░реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рддреБрд░рдВрдд рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рддрд░рд╣, рд╣рдо рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдмрджрд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
 function sum(number, s = 0) { return number === 0 ? s : () => sum(number - 1, s + number) } 


рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 const trampolineSum = trampoline(sum) trampolineSum(100000) // 5000050000 

рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИред рдореИрдВрдиреЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдФрд░ рд╕реВрддреНрд░реЛрдВ рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рд╡рд┐рд╖рдп рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреА рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд░реВрд╕реА рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд░рд╣реЗ :)

рдЕрджреНрдпрддрди
рдкреНрд░рджрд░реНрд╢рди:

# 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐
рдХреЛрдб # 1
 function sum(n) { return n === 0 ? 0 : n + sum(n - 1) } console.time("run") sum(1000) console.timeEnd("run") 


рдкрд░рд┐рдгрд╛рдо # 1 рд╕рдлрд╛рд░реА 12.1.2 рдХрд╛
[рдбрд┐рдмрдЧ] рд░рди: 0.353ms
[рдбрд┐рдмрдЧ] рд░рди: 0.281ms
[рдбрд┐рдмрдЧ] рд░рди: 0.305ms
[рдбрд┐рдмрдЧ] рд░рди: 0.315 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.319 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.231ms
[рдбрд┐рдмрдЧ] рд░рди: 0.255ms
[рдбрд┐рдмрдЧ] рд░рди: 0.334ms
[рдбрд┐рдмрдЧ] рд░рди: 0.370ms
[рдбрд┐рдмрдЧ] рд░рди: 0.274ms
[рдбрд┐рдмрдЧ] рд░рди: 0.260 рдореА

рдкрд░рд┐рдгрд╛рдо # 1 Google Chrome 78.0.3892.0
рд░рди: 0.118896484375ms
рд░рди: 0.101806640625ms
рд░рди: 0.099853515625ms
рд░рди: 0.10205078125ms
рд░рди: 0.10302734375ms
рд░рди: 0.099853515625ms
рд░рди: 0.106201171875ms
рд░рди: 0.103759765625ms
рд░рди: 0.105224609375ms
рд░рди: 0.262939453125ms
рд░рди: 0.136962890625ms
рд░рди: 0.10107421875ms
рд░рди: 0.10302734375ms


# 2 Iteration
рдХреЛрдб # 2
 function sum(n) { let sum = 0 for (let i = 1; i <= n; i++) { sum += i } return sum } console.time("run") sum(1000) console.timeEnd("run") 


рдкрд░рд┐рдгрд╛рдо # 2 рд╕рдлрд╛рд░реА 12.1.2 рдХрд╛
[рдбрд┐рдмрдЧ] рд░рди: 0.562ms
[рдбрд┐рдмрдЧ] рд░рди: 0.552ms
[рдбрд┐рдмрдЧ] рд░рди: 0.502ms
[рдбрд┐рдмрдЧ] рд░рди: 0.527ms
[рдбрд┐рдмрдЧ] рд░рди: 0.434ms
[рдбрд┐рдмрдЧ] рд░рди: 0.462ms
[рдбрд┐рдмрдЧ] рд░рди: 0.511ms
[рдбрд┐рдмрдЧ] рд░рди: 0.528ms
[рдбрд┐рдмрдЧ] рд░рди: 0.549ms
[рдбрд┐рдмрдЧ] рд░рди: 0.475ms
[рдбрд┐рдмрдЧ] рд░рди: 0.530 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.494ms

Google Chrome рдХрд╛ рдкрд░рд┐рдгрд╛рдо # 2 78.0.3892.0
рд░рди: 0.932861328125ms
рд░рди: 0.751953125ms
рд░рди: 0.4580078125ms
рд░рди: 0.678955078125ms
рд░рди: 0.424072265625ms
рд░рди: 0.505859375ms
рд░рди: 0.563720703125ms
рд░рди: 0.404052734375ms
рд░рди: 0.411865234375ms
рд░рди: 0.634033203125ms
рд░рди: 0.4169921875ms
рд░рди: 0.390869140625ms
рд░рди: 0.464111328125ms


# 3 рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ trampoline
рдХреЛрдб # 3
 function trampoline(fn) { return function(...args) { let result = fn.apply(fn.context, args) while (typeof result === 'function') { result = result() } return result } } function sum(number, s = 0) { return number === 0 ? s : () => sum(number - 1, s + number) } const trampolineSum = trampoline(sum) console.time("run") trampolineSum(1000) console.timeEnd("run") 


рдкрд░рд┐рдгрд╛рдо # 3 рдХреА рд╕рдлрд╛рд░реА 12.1.2
[рдбрд┐рдмрдЧ] рд░рди: 0.936ms
[рдбрд┐рдмрдЧ] рд░рди: 0.792ms
[рдбрд┐рдмрдЧ] рд░рди: 0.882 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.826 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.968ms
[рдбрд┐рдмрдЧ] рд░рди: 0.818ms
[рдбрд┐рдмрдЧ] рд░рди: 1.681ms
[рдбрд┐рдмрдЧ] рд░рди: 0.777ms
[рдбрд┐рдмрдЧ] рд░рди: 1.109ms
[рдбрд┐рдмрдЧ] рд░рди: 0.832 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 0.826 рдореА

Google Chrome рдХрд╛ рдкрд░рд┐рдгрд╛рдо # 3 78.0.3892.0
рд░рди: 0.60888671875ms
рд░рди: 0.989990234375ms
рд░рди: 0.567138671875ms
рд░рди: 0.56005859375ms
рд░рди: 1.0087890625ms
рд░рди: 0.5400390625ms
рд░рди: 0.578125ms
рд░рди: 0.541015625ms
рд░рди: 0.557861328125ms
рд░рди: 1.97607421875ms
рд░рди: 0.570068359375ms
рд░рди: 0.593017578125ms
рд░рди: 0.530029296875ms
рд░рди: 0.89794921875ms
рд░рди: 0.590087890625ms


# 4 рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ trampoline (рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛)
рдХреЛрдб # 4
 function trampoline(fn) { return function(...args) { let result = fn.apply(fn.context, args) while (typeof result === 'function') { result = result() } return result } } function sum(number, s = 0) { return number === 0 ? s : () => sum(number - 1, s + number) } const trampolineSum = trampoline(sum) console.time("run") trampolineSum(100000) console.timeEnd("run") 


рдкрд░рд┐рдгрд╛рдо # 4 рд╕рдлрд╛рд░реА 12.1.2 рдХрд╛
[рдбрд┐рдмрдЧ] рд░рди: 33.693ms
[рдбрд┐рдмрдЧ] рд░рди: 24.564ms
[рдбрд┐рдмрдЧ] рд░рди: 25.313ms
[рдбрд┐рдмрдЧ] рд░рди: 23.262ms
[рдбрд┐рдмрдЧ] рд░рди: 24.848ms
[рдбрд┐рдмрдЧ] рд░рди: 23.909 рдореА
[рдбрд┐рдмрдЧ] рд░рди: 24.248ms
[рдбрд┐рдмрдЧ] рд░рди: 32.416ms
[рдбрд┐рдмрдЧ] рд░рди: 24.090ms
[рдбрд┐рдмрдЧ] рд░рди: 23.986ms

Google Chrome рдХрд╛ рдкрд░рд┐рдгрд╛рдо # 4 78.0.3892.0
рд░рди: 40.73681640625ms
рд░рди: 33.955078125ms
рд░рди: 40.907958984375ms
рд░рди: 37.693115234375ms
рд░рди: 28.929931640625ms
рд░рди: 30.7548828125ms
рд░рди: 29.720947265625ms
рд░рди: 40.8310546875ms
рд░рди: 31.5830078125ms
рд░рди: 30.712890625ms
рд░рди: 30.162841796875ms
рд░рди: 31.56103515625ms


рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдбрд░рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi464915/


All Articles