Ви шукаєте виступ у неправильному місці. Проблема функціональних викликів не в тому, що вони коштують багато. Є ще одна проблема. Функціональні дзвінки можуть бути абсолютно безкоштовними, і у вас все ще буде ця інша проблема.
Це те, що функція подібна до кредитної картки. Оскільки ви можете легко користуватися ним, ви, як правило, використовуєте його більше, ніж, можливо, слід. Припустимо, ви називаєте це на 20% більше, ніж потрібно. Потім типове велике програмне забезпечення містить кілька шарів, кожен викликує функцій у нижньому шарі, тому коефіцієнт 1,2 може ускладнюватися кількістю шарів. (Наприклад, якщо п’ять шарів, і кожен шар має коефіцієнт уповільнення 1,2, складний коефіцієнт уповільнення становить 1,2 ^ 5 або 2,5.) Це лише один із способів думати про це.
Це не означає, що вам слід уникати функціональних викликів. Що це означає, що коли код працює та працює, ви повинні знати, як знайти та усунути відходи. На сайтах stackexchange є багато чудових порад, як це зробити.
Це дає один із моїх внесків.
ДОДАТО: Невеликий приклад. Одного разу я працював у команді над програмним забезпеченням на заводських поверхах, який відслідковував низку робочих доручень або "робочих місць". Була функція, JobDone(idJob)
яка могла визначити, чи виконується робота. Робота виконувалася тоді, коли всі її підзадачі були виконані, і кожне з них було виконано, коли були виконані всі його суб-операції. Усі ці речі відслідковувались у реляційній базі даних. Один виклик до іншої функції міг витягти всю цю інформацію, так JobDone
звану цю іншу функцію, побачив, чи виконується робота, а решту відкинув. Тоді люди могли легко написати такий код:
while(!JobDone(idJob)){
...
}
або
foreach(idJob in jobs){
if (JobDone(idJob)){
...
}
}
Бачите сенс? Ця функція була настільки "потужною" та легкою для виклику, що вона називалась занадто багато. Тому проблема продуктивності полягала не в тому, щоб входити та виходити з функції. Було, що потрібен більш прямий спосіб сказати, чи були виконані завдання. Знову ж таки, цей код міг бути вбудований у тисячі рядків інакше невинного коду. Спроба виправити це заздалегідь - це те, що намагаються зробити всі, але це як намагатися кидати дротики в темну кімнату. Натомість вам потрібно запустити його, а потім «повільний код» розповісти, що це таке, просто забираючи час. Для цього я використовую випадкові паузи .