Насколько медленны исключения .NET?

Строка setInterval должна выглядеть так: -

 this.intervalID = setInterval(
     (function(self) {         //Self-executing func which takes 'this' as self
         return function() {   //Return a function in the context of 'self'
             self.retrieve_rate(); //Thing you wanted to run as non-window 'this'
         }
     })(this),
     this.INTERVAL     //normal interval, 'this' scope not impacted here.
 ); 

Изменить: тот же принцип применяется к «onload». В этом случае его общий для «внешнего» кода делать мало, он просто устанавливает запрос, а затем отправляет его. В этом случае дополнительные накладные расходы дополнительные функции, как в приведенном выше коде, не нужны. Ваш retrieve_rate должен выглядеть следующим образом: -

retrieve_rate : function()
{
    var self = this;
    var ajax = new XMLHttpRequest();
    ajax.open('GET', 'http://xyz.com', true);
    ajax.onreadystatechanged= function()
    {
        if (ajax.readyState == 4 && ajax.status == 200)
        {
            // prefs available as self.prefs
        }
    }
    ajax.send(null);
}
143
задан Peter Mortensen 26 November 2009 в 23:03
поделиться

9 ответов

Я иду "не медленная" сторона - или более точно "не достаточно медленный для создания его стоящим предотвращения их в нормальной эксплуатации". Я записал два короткий статьи об этом. Существуют критические замечания аспекта сравнительного теста, которые являются главным образом до "в реальной жизни было бы больше стека для прохождения через, таким образом, Вы унесете кэш и т.д." - но использующий коды ошибки для прокладывания себе путь стек был бы также , уносят кэш, таким образом, я не рассматриваю что как особенно хороший аргумент.

Только для прояснения - я не поддерживаю исключения использования, где они не логичны. Например, int.TryParse совершенно подходит для преобразования данных от пользователя. Уместно при чтении сгенерированного машиной файла, где средство отказа "Файл не находится в формате, это предназначено, чтобы быть, я действительно не хочу пытаться обработать это, поскольку я не знаю то, что еще могло бы быть неправильным".

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

203
ответ дан Jon Skeet 26 November 2009 в 23:03
поделиться

У меня никогда не было проблемы производительности за исключениями. Я использую исключения много - я никогда не использую коды возврата, если я могу. Они - плохая практика, и по-моему, запах как запутанный код.

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

, Но если Вы бросаете у основания стека и ловите наверху (Вы заменяете целой цепочкой кодов возврата с одним броском/выгодой), все дорогостоящие операции сделаны однажды.

В конце дня, они - допустимая функция языка.

Только для подтверждения моей точки зрения

работайте эти код в этой ссылке (слишком большой для ответа).

Результаты на моем компьютере:

marco@sklivvz:~/develop/test$ mono Exceptions.exe | grep PM
10/2/2008 2:53:32 PM
10/2/2008 2:53:42 PM
10/2/2008 2:53:52 PM

Метки времени производятся вначале, между кодами возврата и исключениями, в конце. Требуется то же время в обоих случаях. Обратите внимание, что необходимо скомпилировать с оптимизацией.

2
ответ дан Sklivvz 26 November 2009 в 23:03
поделиться
  • 1
    При установке Грязный = ложь действительно сохраняет запись. – Olivier Jacot-Descombes 21 December 2012 в 18:46

В режиме выпуска издержки минимальны.

, Если Вы не собираетесь быть исключениями использования для управления потоком (пример, нелокальные выходы) рекурсивным способом, я сомневаюсь, что Вы будете в состоянии заметить различие.

1
ответ дан leppie 26 November 2009 в 23:03
поделиться
  • 1
    необходимо ли явно сохранить запись прежде, чем установить грязный флаг, или Доступ заботится об этом? – HelloW 21 December 2012 в 18:17

Мой сервер XMPP получил основное повышение скорости (извините, никакие фактические числа, чисто наблюдательные) после того, как я последовательно пытался предотвратить их (такие как проверка, если сокет подключен перед попыткой считать больше данных), и предоставление мне способы избежать их (упомянутые методы TryX). Это было только с приблизительно 50 активными (болтающими) виртуальными пользователями.

4
ответ дан Jonathan C Dickinson 26 November 2009 в 23:03
поделиться

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

Часто в нормальной прикладной логике Вы выполняете цикличное выполнение, где то же действие является повторенными тысячами/миллионами времен. В этом случае, с некоторым очень простым профилированием (см. класс Секундомера), Вы видите для себя, что выдача исключения вместо говорит простое, если оператор может оказаться существенно медленнее.

На самом деле я когда-то считал, что команда.NET в Microsoft представила методы TryXXXXX в.NET 2.0 ко многим основным типам FCL конкретно, потому что клиенты жаловались, что производительность их приложений была настолько медленной.

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

Microsoft теперь рекомендует, чтобы методы TryXXX использовались особенно в этой ситуации для предотвращения таких возможных проблем производительности.

я мог быть неправым, но это кажется, что Вы не уверены в правдивости "сравнительных тестов", о которых Вы читали. Простое решение: Испытайте его для себя.

6
ответ дан Ash 26 November 2009 в 23:03
поделиться

Я понятия не имею, какие люди говорят о том, когда они говорят, что являются медленными, только если они брошены.

РЕДАКТИРОВАНИЕ: Если Исключения не выдаются, то это означает выполнение нового Исключения () или что-то как этот. Иначе исключение собирается заставить поток быть приостановленным, и стек, который будет обойден. Это может быть в порядке в меньших ситуациях, но в веб-сайтах интенсивного трафика, полагаясь на исключения, поскольку рабочий процесс или механизм пути выполнения, конечно, вызовут Вас проблемы производительности. Исключения, по сути, не плохи, и полезны для выражения исключительных условий

, рабочий процесс исключения в приложении.NET использует первые и вторые случайные исключения. Для всех исключений, даже если Вы ловите и обрабатываете их, все еще создается объект исключения, и платформа все еще должна обойти стек для поиска обработчика. Если Вы ловите и повторно бросаете, конечно, который собирается занять больше времени - Вы собираетесь получить исключение первого шанса, поймать его, повторно бросить его, вызывая другое исключение первого шанса, которое тогда не находит обработчик, который тогда вызывает исключение второго шанса.

Исключениями являются также объекты на "куче" - поэтому при броске тонн исключений тогда Вы вызываете и производительность и проблемы памяти.

, Кроме того, согласно моей копии "Тестирования производительности веб-приложения Microsoft.NET", записанные командой ACE:

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

Мой собственный опыт в поле показал, что сокращение исключений значительно помогло производительности. Конечно, существуют другие вещи, которые Вы принимаете во внимание, когда тестирование производительности - например, если Ваш Дисковый ввод-вывод застрелен, или Ваши запросы, находится в секунды, то это должно быть Вашим фокусом. Но нахождение и удаление исключений должны быть жизненно важной частью той стратегии.

8
ответ дан Cory Foy 26 November 2009 в 23:03
поделиться

Если Вы сравниваете их с кодами возврата, они являются медленными как ад. Однако, поскольку предыдущие плакаты указали, что Вы не хотите добавлять нормальную операцию программы, таким образом, Вы только поражали перфект, когда проблема происходит, и в подавляющем большинстве производительности случаев больше не имеет значения (поскольку исключение подразумевает контрольно-пропускной пункт так или иначе).

Их определенно стоит использовать по кодам ошибки, преимуществами является обширный IMO.

2
ответ дан Quibblesome 26 November 2009 в 23:03
поделиться

Существует категорический ответ на это от парня, который реализовал их - Chris Brumme. Он записал превосходная статья блога о предмете (предупреждение - ее очень длинное) (warning2 - его очень хорошо записанный, если Вы будете техником, то Вы считаете его до конца и затем иметь для составления часов после работы:))

резюме: они являются медленными. Они реализованы как Win32 исключения SEH, таким образом, некоторые даже передадут кольцо 0 границ ЦП! Очевидно, в реальном мире, Вы будете делать большую другую работу, таким образом, нечетное исключение не будет замечено вообще, но если Вы используете их для процесса выполнения программы кроме Вашего приложения, которое будет коваться. Это - другой пример маркетинговой машины MS, вредящей нам. Я вспоминаю один microsoftie сообщение нам, как они подверглись абсолютно нулю наверху, который является полной чушью.

Chris дает подходящую кавычку:

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

29
ответ дан gbjbaanb 26 November 2009 в 23:03
поделиться
  • 1
    См. мой комментарий к другому ответу, если бы это было проблемой формы, этого не произошло бы при редактировании таблицы, прямой ни с чем иным открытым! – aSystemOverload 22 December 2012 в 11:06

Одно быстрое примечание здесь по производительности, связанной с ловлей исключений.

, Когда путь выполнения вводит блок 'попытки', ничего волшебного не происходит. Нет никакой инструкции 'по попытке' и никакой стоимости, связанной или с вводом или с выходом из блока попытки. Информация о блоке попытки хранится в метаданных метода, и эти метаданные используются во времени выполнения каждый раз, когда исключение повышено. Механизм выполнения спускается со стека, ища первый вызов, который содержался в блоке попытки. Любые издержки, связанные с обработкой исключений, происходят только, когда исключения выдаются.

0
ответ дан Drew Noakes 26 November 2009 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: