Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Быстродействие try/catch (https://javascript.ru/forum/events/3491-bystrodejjstvie-try-catch.html)

milk3dfx 26.04.2009 22:21

Быстродействие try/catch
 
В моём случае я заменил простой if конструкцией try/catch замедлит ли она выполнение скрипта или наоборот этот способ более предпочтительнее так как ошибочные значения редко появляются.
Вариант 1.
listBody.getItem = function(ind){
	if(ind<0||ind>=this.childNodes.length)
		return false;
	return this.childNodes[ind].lastChild;
}

Вариант 2.
listBody.getItem = function(ind){
	try{
		return this.childNodes[ind].lastChild;
	}
	catch(e){
		return false;
	}
}

Хотя в обоих случаях можно обойтись и без проверки, но всё таки интересный вопрос.

Андрей Параничев 26.04.2009 23:18

Если это узкое место (выполняется часто, например), лучше использовать if, который проверял бы верное значение и возвращал результат. Try-catch не особо хорош в плане производительности. В вашем случае я бы остановился на варианте:
listBody.getItem = function(ind){
    return ((ind in this.childNodes) && this.childNodes[ind].lastChild) || false;
}

Riim 26.04.2009 23:26

Цитата:

Сообщение от milk3dfx
замедлит ли она выполнение скрипта или наоборот этот способ более предпочтительнее

Для тестирования в простейших случаях подходит такой код:
var startTime = new Date();
for (var __i = 0; __i < 100001; __i++) {
	//
}
alert((new Date()) - startTime);


Даже если try/catch здесь сработает быстрее, я бы не стал его так использовать. Все-таки не для этого он задумывался. Разве что в порядке исключения, там, где по-другому оптимизировать никак, но очень надо.

Dmitry A. Soshnikov 26.04.2009 23:29

Цитата:

Сообщение от Андрей Параничев
лучше использовать if, который проверял бы верное значение и возвращал результат

А, кстати, тоже "философский" вопрос. Как правило, возврат верного значения требует различных проверок, предварительных действий и т.д. Поэтому, чаще - наоборот - сначала отсеиваются (сразу return'ами) все ложные условия (нет смысла продолжать анализировать код, если из 10 проверок, сразу не сработала первая - значит, выходим), а дальше уже идёт обработка и возврат верного значения. Хотя, когда как, конечно.

Zeroglif 26.04.2009 23:40

Блок 'try-catch' быстротой никогда не отличался, не работает в совсем старых версиях, в менее простых случаях скорее всего придётся какие-нибудь if-условия втыкать внутрь, чтоб с причиной разобраться...

milk3dfx 27.04.2009 01:31

Спасибо за ответы
try/catch это очень полезная конструкция и позволяет упростить создание некоторых вещей. Но всё таки и в правду не стоит им злоупотреблять.

Цитата:

Для тестирования в простейших случаях подходит такой код:
обязательно буду пользоваться
listBody.getItem = function(ind){
    return ((ind in this.childNodes) && this.childNodes[ind].lastChild) || false;
}

Хорошее решение, лучше чем мой первый вариант. если вы не возражаете я его вставлю к себе.
В длинном коде конечно наверное стоит проводить проверки в ходе выполнения кода или перед его выполнением.


Часовой пояс GMT +3, время: 00:09.