Тема: Змінні та швидкодія

Є скрипт. Його перманентне завдання - реагувати на дії користувача. Цей скрипт має безліч функцій і всі вони в певній послідовності викликаються, коли користувач здійснює яку-небудь дію. Звісно, що в тілі кожної функції оголошуються локальні змінні.
[code=javascript]'use strict';
(function () {

    function doSomeThing(element) {
        let a = ...;
        let b = ...;
        ... do some stuff ...
    }

    function doSomeThingElse(element) {
        let c = ...;
        let d = ...;
        ... do some stuff ...
    }

    function finishAll(element) {
        let foo = ...;
        let bar = ...;
        ... do some stuff ...
    }
   
    window.onclick = function(event) {
        doSomeThing(event.target);
        doSomeThingElse(event.target);
        finishAll(event.target);
    }

})();[/code]
В мене таке питання: чи резонно винести оголошення всіх цих змінних на початок скрипту задля пришвидшення його роботи?
[code=javascript]'use strict';
(function () {
   
    let element, a, b, c, d, foo, bar;
   
    function doSomeThing() {
        ... do some stuff ...
    }

    function doSomeThingElse() {
        ... do some stuff ...
    }

    function finishAll() {
        ... do some stuff ...
    }

    window.onclick = function(event) {
        element = event.target;
        doSomeThing();
        doSomeThingElse();
        finishAll();
    }

})();[/code]

2

Re: Змінні та швидкодія

На питання "що швидше" можна відповісти одним-єдиним способом - протестувати.
Причому з урахуванням того, що JavaScript - скриптова мова і проходить силу оптимізацій перед виконанням, відповідь може суттєво залежати від браузера і його конкретної версії.
Я в цілому розумію міркування, які могли викликати таке припущення, так само, як і деякі пастки, які можуть призвести до погіршення роботи коду через це (скажімо, якщо станеться переповнення хеш-таблиці локальних змінних); але витрати на одноразове створення змінних у будь-якому разі незначні порівняно із багатьма іншими можливими оптимізаціями. А от потрапити в халепу через одні змінні в різних функціях надто легко. Загальна порада - не оптимізуйте код без потреби.

Подякували: DOP1

3

Re: Змінні та швидкодія

Згідний зі всім, що сказав koala, крім фрази "не оптимізуйте код без потреби".
Оптимізація це завжди прекрасно. Але виносити змінні туди, де вони не використовуються, це ви явно не в той бік прямуєте.

4

Re: Змінні та швидкодія

premature optimization is the root of all evil

Подякували: mike.proshchuk, FakiNyan, leofun013

5

Re: Змінні та швидкодія

та, це дуже сумно, коли корчиш з себе генія і оптимізовуєш якусь штучку, і в тебе й не дуже виходе оптимізувати, але вже стільки часу витратив, що кидати якось не хочеться, а після цього розумієш, що завдання взагалі не вимагало створення тією штучки, на оптимізацію котрої вже витрачено купу часу, уххх...

6

Re: Змінні та швидкодія

Не резонно. Якщо винесеш всі змінні глобально, то вони будуть довше зберігатись в памяті

7

Re: Змінні та швидкодія

Змінні в пам'яті не витрачають процесорний час, а за це пан mike.proshchuk і хвилюється. А от виділення - якусь наносекунду таки витрачає.
Хоча знову ж таки, цей код викликається лише у відповідь на дії користувача. Користувач не зробить мільйон дій на секунду, навіть тисячу, тому втрата наносекунди не дуже вплине на швидкодію.

8 Востаннє редагувалося ReAl (06.11.2018 10:40:50)

Re: Змінні та швидкодія

leofun01 написав:

Оптимізація це завжди прекрасно.

Егеж. Так і називається — «Солодкий гріх передчасної оптимізації» :D

Подякували: 221VOLT, FakiNyan, leofun013

9

Re: Змінні та швидкодія

ReAl написав:

Егеж. Так і називається — «Солодкий гріх передчасної оптимізації» :D

Взагалі-то стаття в перекладі називається "Передчасна оптимізація - корінь усього зла".

10 Востаннє редагувалося ReAl (06.11.2018 22:02:27)

Re: Змінні та швидкодія

mike.proshchuk написав:
ReAl написав:

Егеж. Так і називається — «Солодкий гріх передчасної оптимізації» :D

Взагалі-то стаття в перекладі називається "Передчасна оптимізація - корінь усього зла".

По-перше, «взагалі-то»™ сторінка по лінку називається просто «Передчасна оптимізація».
А цитату (мені давно відому) — епіграф до цієї сторінки — взято з роботи Кнута, яка називається «Structured Programming with go to Statements»
Тобто в межах цього обговорення назву «premature optimization is the root of all evil» мав лише лінк, даний koala. Але там з тим же успіхом могло бути написано слово «пруфлінк».

По друге, я цитував слова leofun01 «Оптимізація це завжди прекрасно», і мої слова щодо солодкого гріха (сам іноді грішу ;)) стосувалися саме такого ставлення.

p.s. Щодо передчасної оптимізації — є така історія, пов'язана з компілятором FORTRAN, здається, до CDC-6600. Років через п'ять експлуатації компілятора він вивалився з помилкою в одній з процедур. Це виявилася старанно виписана процедура, яка оптимізує згенерований код для якоїсь конкретної комбінації умов.
Помилка була така, що процедура не могла не впасти.
Тобто за оті років зо п'ять вона викликалася вперше.

Підсумок: є вільний час і хочеться погрішити — оптимізуйте отак перший ліпший код. Інакше напишіть правильну програму способом, який полегшує написання і модифікацію.
Потім проаналізуйте вузькі місця і оптимізуйте їх.

Подякували: leofun01, Yola2