Вопрос по функциям
Скажите пожалуйста использование функций в js не влияет на быстродействие..(например в php на вызов функций затрачивается больше время чем просто следовать условиям)..В js токого нет ? Например создать функцию с условиями для нескольких обработчиков для сокращения кода или лучше условия писать в самих обработчиках?
|
например в php на вызов функций затрачивается больше время чем просто следовать условиям
Имеется ввиду сам вызов или же исполнение? И на сколько больше, что за условия, и что за функции? |
Влияет, но незначительно: современные интерпретаторы JS сами по себе очень быстрые. Лучше выносить.
|
Если не ошибаюсь в php вызов и исполнение медленее 1.5 раза чем просто условия.
Вернусь к моей другой теме..вы Laimas должны помнить мою тему про пост из контента..Так вот..там обработчиков несколько и у них похожи проверки и условия.. Если создать функцию и вынисти в нее похожие условия а из обработчиков вызывать эту функцию.. |
Вот, пожалуйства, сравнение производительности:
function test(func) { console.time(func.name); func(); console.timeEnd(func.name); } function separate() { let results = []; let isPositive = function(number) {return number > 0}; for (let i = 0; i < 1000000; i++) { results.push(isPositive(i)); } console.log(results); } function inline() { let results = []; for (let i = 0; i < 1000000; i++) { results.push(i > 0); } console.log(results); } test(separate); test(inline); Запускать, конечно, надо несколько раз. У меня в FF 37.0.2 в среднем разница в пределах семи процентов в пользу inline (нет, бывают скачки, но как в separate, так и в inline примерно равномерно). |
Например
$('.mod1').click(function() { var url = $(this).attr('href'); $.ajax({ type: 'GET', url: '?ajax=' + url, success: function(data){ $('#content').html(data); } }); if(url != window.location){ window.history.pushState(null, null, url); } return false; }); $('#content').on('click','.rem1',function(){ var url = $(this).attr('href'); $.ajax({ type: 'GET', url: '?ajax=' + url, success: function(data){ $('#content').html(data); } }); return false; }); Сделать допустим так $('.mod1').click(function() { goGo(); if(url != window.location){ window.history.pushState(null, null, url); } return false; }); $('#content').on('click','.rem1',function(){ goGo(); return false; }); function goGo(){ var url = $(this).attr('href'); $.ajax({ type: 'GET', url: '?ajax=' + url, success: function(data){ $('#content').html(data); } }); } |
...ты действительно считаешь, что производительность в обработчике щелчка, еще и отправляющим ajax, действительно имеет хоть какую-то роль?
|
Цитата:
|
Ты действительно считаешь, что единичная задержка в пределах 1/250000 от скорости человеческой реакции имеет хоть какую-то роль? Да там естественная вариация скорости будет в десятки, если не в сотни, раз больше.
console.time("inline"); console.log(1 > 0); console.timeEnd("inline"); console.time("separate"); let isPositive = function(number) {return number > 0}; console.log(isPositive(1)); console.timeEnd("separate"); Вообще, в высокоуровневом программировании чистота кода обычно превыше всего. |
Ну если разница так мала тогда у меня вопрос отпал..
Всем спасибо... Тема закрыта.. |
Вообще, оптимизатор может понять, что функция вырожденная и просто заинлайнить ее. Главное - инкапсулировать и не юзать эвал.
|
Цитата:
|
Перед компилированием кода любой нормальный интерпретатор прогоняет его через оптимизатор. Грубя говоря, вот так:
//до оптимизации function testForPositiveness(numbers) { let isPositive = (number) => number > 0; let results = []; for (let number of numbers) { results.push(isPositive(number)); } return results; } //после оптимизации function testForPositiveness(numbers) { let results = []; for (let number of numbers) { results.push(number > 0); } return results; } Здесь оптимизатор видит, что функция isPositive может быть использована только в testForPositiveness и что можно с чистой совестью заинлайнить её. Если бы isPositive была где-нибудь в глобальном скопе, ничего не вышло бы (неизвестно, кто еще может её вызывать). Если бы где-то внутри testForPositiveness стоял эвал, ничего не вышло бы (по той же причине; заодно похерилась бы куча остальных возможных оптимизаций). |
Часовой пояс GMT +3, время: 12:46. |