Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.01.2010, 17:23
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

try catch vs. returns кто быстрее ?
Задача такая
есть callback'и в таком виде
function abc1(){
  try {abc2()} catch(e){};
  alert('все');
  }
function abc2(){
  и т.д.
  }
function abcN(){
  return; // или trow new Error('zdas');
  }

abc1();

Вопрос1: какой из методов быстрее прийдет к alert'у метод return'ов или метод генерации ошибок? Знаю в PHP метод throw эффективнее. Как обстоят дела в JS?

Вопрос2: throw не генерирует утечку памяти ? например, забыл почистить память от адресов возврата, переменные в промежуточных функциях и т.п. ?

Кто сталкивался с этим вопросом ?
Ответить с цитированием
  #2 (permalink)  
Старый 11.01.2010, 17:28
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от PeaceCoder
какой из методов быстрее прийдет к alert'у метод return'ов или метод генерации ошибок?
А тест сделать? Логика подсказывает, что throw будет значительно медленней. Другое дело, что return сразу из всех функций сделать невозможно, и иногда других способов, кроме как throw, нет.

Сообщение от PeaceCoder
например, забыл почистить память от адресов возврата, переменные в промежуточных функциях и т.п. ?
Кто забыл? Программист? А где он чего чистит в JS?
Ответить с цитированием
  #3 (permalink)  
Старый 11.01.2010, 17:37
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Kolyaj
Кто забыл? Программист? А где он чего чистит в JS?
=)) интерпретатор. ведь throw это исключение и следствием его может быть приостановка выполнения всей работы => интерпретатор может не освобождать память.
Сообщение от Kolyaj
Другое дело, что return сразу из всех функций сделать невозможно, и иногда других способов, кроме как throw, нет.
Функции строятся так, что если идет возврат они продолжают цикл. если цикл закончился возвращаютсся либо ретурном либо throw
Ответить с цитированием
  #4 (permalink)  
Старый 11.01.2010, 18:09
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Использовать throw/catch/finally для возврата значения, имхо, как-то гхм-м… некошерно.

Kolyaj,
я тут бенчмарк сделал. Оказалось, что в Опере время работы throw на глубине 5 функций — 0 мсек, а 5 return — 0 мсек. А если нет разницы…
Ответить с цитированием
  #5 (permalink)  
Старый 11.01.2010, 18:22
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

а разница есть
N=30; //уровень вложенности
C=10000; //количество повторов;
Tret=0; Ttry=0;

function fn1(){
  n=N; R=0;
  fn2();
  Tret+=((new Date()).getTime()-T);
  R++;
  n=N;
  try{fn2();}catch(e){}
  Ttry+=((new Date()).getTime()-T);
  }

function fn2(){
  T=(new Date()).getTime();
  while (n) fn2(n--);
  if (R) throw new Error('');
  }
 
for(I=0;I<C;I++) fn1();

alert('return: '+(Tret/C)+'ms, try: '+(Ttry/C)+'ms');

//----------------
//машина: 2ггц
//FF3.5:            return: 0.0293ms, try: 4.1967ms
//Chrome3.0.195.38: return: 0.0021ms, try: 0.0147ms 
//IE8:              return: 0.0434ms, try: 0.0583ms
//Opera10.10:       return: 0.0249ms, try: 0.0015ms
//Safari4:          return: 0.0046ms, try: 0.0119ms

Цифры приведены на 1 операцию fn1();
Если не на порядок то все равно быстрее try. Вопрос снят. тему можно колуз если нет вопросов.
А в опере почемуто быстрее...

по идее try/catch должен работать быстрее если интерпретатор потроен грамотно. т.к. взять из списка адрес стека до try и сам адрес возврата при catch на ассемблере это всего 2 операции.

Последний раз редактировалось PeaceCoder, 11.01.2010 в 18:33.
Ответить с цитированием
  #6 (permalink)  
Старый 12.01.2010, 09:31
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от PeaceCoder
Если не на порядок то все равно быстрее try
По твоим цифрам он только в опере быстрее.
Ответить с цитированием
  #7 (permalink)  
Старый 12.01.2010, 11:34
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Вообще, идеологически, у них (trhow, return) назначения разные; частные случае - это частные случаи.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #8 (permalink)  
Старый 12.01.2010, 21:41
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Kolyaj
По твоим цифрам он только в опере быстрее.
не правильно понял, точнее я не правильно выразился. returns если не напорядок то все равно быстрее, чем try
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто знает как разрешить выполнения сценариев в Ie ? JsLoveR Общие вопросы Javascript 5 24.12.2009 19:25