Почему блоки попытки являются дорогими?

Решение - это всего лишь однострочный запрос, как показано ниже:

grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;

Замените ROOT своим именем пользователя mysql. Замените PASSWORD своим паролем mysql.

51
задан Esteban Araya 6 October 2008 в 18:53
поделиться

11 ответов

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

2
ответ дан Joel Coehoorn 7 November 2019 в 20:22
поделиться

Блок попытки не является дорогим вообще. Минимальная стоимость понесена, если исключение не выдается. И если исключение было выдано, это исключительно обстоятельство, и Вы больше не заботитесь о производительности. Имеет значение, если Ваша программа занимает 0,001 секунды или 1,0 секунды для падения? Нет, это не делает. То, что имеет значение, - то, как хороший информация сообщила Вам, так, можно зафиксировать ее и остановить ее происходящий снова.

5
ответ дан Anthony 7 November 2019 в 20:22
поделиться

IMO это целое обсуждение похоже говорящее, "ничего себе, сокращает, являются дорогими, потому что я должен увеличить счетчик... я не собираюсь использовать их больше", или, "ничего себе, создание объекта занимает время, я не собираюсь создавать тонну объектов больше".

Нижняя строка является Вашим кодом добавления, по-видимому, по причине. Если строки кода затем не подвергались немного служебным, даже если его 1 цикл ЦП, то, почему он будет существовать? Ничто не свободно.

мудрая вещь сделать, как с любой строкой кода Вы добавляете к своему приложению, должен только поместить его там, если Вам нужен он, чтобы сделать что-то. Если ловля исключения является чем-то, что необходимо сделать, затем сделать это... точно так же, как при необходимости в строке, чтобы сохранить что-то, создать новую строку. Теми же средствами, если Вы объявляете переменную, которая никогда не используется, Вы тратите впустую память и циклы ЦП для создания его, и это должно быть удалено. то же с попыткой/выгодой.

, Другими словами, если существует код там, чтобы сделать что-то, то предполагают, что выполнение чего-то собирается использовать ЦП и/или память в некотором роде.

3
ответ дан CodingWithSpike 7 November 2019 в 20:22
поделиться

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

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

Одно из самых больших неправильных представлений об исключениях - то, что они для “exceptional условий. ”, который действительность - то, что они для передачи состояний ошибки. С точки зрения дизайна платформы нет такой вещи как “exceptional condition”. Является ли условие исключительным или не зависит от контекста использования,---, но допускающие повторное использование библиотеки редко знают, как они будут использоваться. Например, OutOfMemoryException мог бы быть исключительным для простого приложения ввода данных; it’s, не настолько исключительный для приложений, делающих их собственное управление памятью (например, SQL-сервер). Другими словами, одно man’s исключительное условие является другим man’s хроническим заболеванием. [http://blogs.msdn.com/kcwalina/archive/2008/07/17/ExceptionalError.aspx]

12
ответ дан Scott Dorman 7 November 2019 в 20:22
поделиться

Я думаю, что люди действительно переоценивают стоимость производительности выдавания исключения. Да, существует хит производительности, но это является относительно крошечным.

я запустил следующий тест, бросив и ловя миллион исключений. Потребовалось приблизительно 20 секунд на моем Core 2 Duo Intel , 2.8  GHz. Это - о 50K исключениях секунда. При броске даже небольшой части этого у Вас есть некоторые проблемы архитектуры.

Вот мой код:

using System;
using System.Diagnostics;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < 1000000; i++)
            {
                try
                {
                    throw new Exception();
                }
                catch {}
            }
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.Read();
        }
    }
}
4
ответ дан Peter Mortensen 7 November 2019 в 20:22
поделиться

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

я лично не использую 286, ни делает любого использующего .NET или Java также. Движение. Беспокойство о записи хорошего кода, который будет влиять на Ваших пользователей и других разработчиков вместо базовой платформы, которая хорошо работает для 99,999999% людей, использующих его.

Это, вероятно, не очень полезно, и я не означаю быть уничтожающим, но просто выделяющаяся перспектива.

1
ответ дан Peter Mortensen 7 November 2019 в 20:22
поделиться

Я сомневаюсь, являются ли они особенно дорогими. Много времен, они необходимы/необходимы.

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

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

1
ответ дан Mostlyharmless 7 November 2019 в 20:22
поделиться

Компилятор испускает больше IL при обертывании кода в блоке попытки/выгоды; Посмотрите для следующей программы:

using System;
public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("abc");
    }
}

компилятор испустит этот IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "abc"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

, В то время как для немного измененной версии:

using System;
public class Program
{
    static void Main(string[] args)
    {
        try { Console.WriteLine("abc"); }
        catch { }
    }
}

испускает больше:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       23 (0x17)
  .maxstack  1
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldstr      "abc"
    IL_0007:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000c:  nop
    IL_000d:  nop
    IL_000e:  leave.s    IL_0015
  }  // end .try
  catch [mscorlib]System.Object 
  {
    IL_0010:  pop
    IL_0011:  nop
    IL_0012:  nop
    IL_0013:  leave.s    IL_0015
  }  // end handler
  IL_0015:  nop
  IL_0016:  ret
} // end of method Program::Main

Все эти NOPs и другие стоятся.

3
ответ дан Andrei Rînea 7 November 2019 в 20:22
поделиться

Немного O/T, но...

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

Как способность сказать "перезаписываемый ()" перед "запись ()", наполняют как этот.

Это - достойная идея, и, если используется, это заставляет контролируемые исключительные ситуации в Java выглядеть добрыми глупый - я имею в виду, проверяя на условие и право после этого, будучи вынужденным все еще записать попытку/выгоду того же условия?

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

0
ответ дан Bill K 7 November 2019 в 20:22
поделиться

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

20
ответ дан Bob King 7 November 2019 в 20:22
поделиться

Каждый попытка потребности записать большую информацию, например, указатели вершины стека, значения регистра ЦП, и т.д. таким образом, это может раскрутить стек и возвратить состояние, которым это было при передаче попытка блок в случае, если исключение выдается. Не только, что каждый попытка потребности записать большую информацию, когда исключение выдается, много значений, должна быть восстановлена. Так попытка является очень дорогой и , бросок/выгода является очень дорогим, также.

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

0
ответ дан Mecki 7 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

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