Эффективность анализа (если, TryParse, Try-Catch)

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

Какие из них предлагают лучшую производительность в ситуациях?

Parse(...) // Crash if the case is extremely rare .0001% If (SomethingIsValid) // Check the value before parsing Parse(...) TryParse(...) // Using TryParse try { Parse(...) } catch { // Catch any thrown exceptions } 

Всегда используйте T.TryParse (строка str, вне значения T) . Выбрасывание исключений является дорогостоящим и его следует избегать, если вы можете справиться с ситуацией априори . Использование блока try-catch для «сохранения» производительности (поскольку ваша недопустимая скорость передачи данных низкая) является злоупотреблением обработкой исключений за счет ремонтопригодности и хорошей практики кодирования. Следуйте за разработкой технологий разработки программного обеспечения, напишите свои тестовые примеры, запустите приложение, затем испытайте и оптимизируйте.

«Мы должны забыть о небольшой эффективности, скажем, примерно в 97% случаев: преждевременная оптимизация – это корень всего зла, но мы не должны упускать наши возможности в этом критическом 3%» – «Дональд Кнут»

Поэтому вы произвольно назначаете углеродные кредиты, что производительность try-catch хуже и что производительность TryParse лучше . Только после того, как мы запустили наше приложение и определили, что у нас есть какой-то процесс замедления wrt string, мы бы даже рассмотрели возможность использования чего-либо другого, кроме TryParse.

(отредактируйте: так как кажется, что вопросник хотел, чтобы данные о сроках пошли с хорошими советами, вот запрошенные временные данные)

Времена для различных коэффициентов отказа на 10 000 входов от пользователя (для неверующих):

 Failure Rate Try-Catch TryParse Slowdown 0% 00:00:00.0131758 00:00:00.0120421 0.1 10% 00:00:00.1540251 00:00:00.0087699 16.6 20% 00:00:00.2833266 00:00:00.0105229 25.9 30% 00:00:00.4462866 00:00:00.0091487 47.8 40% 00:00:00.6951060 00:00:00.0108980 62.8 50% 00:00:00.7567745 00:00:00.0087065 85.9 60% 00:00:00.7090449 00:00:00.0083365 84.1 70% 00:00:00.8179365 00:00:00.0088809 91.1 80% 00:00:00.9468898 00:00:00.0088562 105.9 90% 00:00:01.0411393 00:00:00.0081040 127.5 100% 00:00:01.1488157 00:00:00.0078877 144.6 /// Rate of errors in user input /// Total time taken public static TimeSpan TimeTryCatch(double errorRate, int seed, int count) { Stopwatch stopwatch = new Stopwatch(); Random random = new Random(seed); string bad_prefix = @"X"; stopwatch.Start(); for(int ii = 0; ii < count; ++ii) { string input = random.Next().ToString(); if (random.NextDouble() < errorRate) { input = bad_prefix + input; } int value = 0; try { value = Int32.Parse(input); } catch(FormatException) { value = -1; // we would do something here with a logger perhaps } } stopwatch.Stop(); return stopwatch.Elapsed; } /// Rate of errors in user input /// Total time taken public static TimeSpan TimeTryParse(double errorRate, int seed, int count) { Stopwatch stopwatch = new Stopwatch(); Random random = new Random(seed); string bad_prefix = @"X"; stopwatch.Start(); for(int ii = 0; ii < count; ++ii) { string input = random.Next().ToString(); if (random.NextDouble() < errorRate) { input = bad_prefix + input; } int value = 0; if (!Int32.TryParse(input, out value)) { value = -1; // we would do something here with a logger perhaps } } stopwatch.Stop(); return stopwatch.Elapsed; } public static void TimeStringParse() { double errorRate = 0.1; // 10% of the time our users mess up int count = 10000; // 10000 entries by a user TimeSpan trycatch = TimeTryCatch(errorRate, 1, count); TimeSpan tryparse = TimeTryParse(errorRate, 1, count); Console.WriteLine("trycatch: {0}", trycatch); Console.WriteLine("tryparse: {0}", tryparse); } 

Хотя я лично не профилировал разные способы, у этого парня есть:

http://blogs.msdn.com/ianhu/archive/2005/12/19/505702.aspx

Try-Catch всегда будет медленнее. TryParse будет быстрее.

IF и TryParse одинаковы.

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

 Option 1: Will throw an exception on bad data. Option 2: SomethingIsValid() could be quite expensive - particularly if you are pre-checking a string for Integer parsability. Option 3: I like this. You need a null check afterwards, but it's pretty cheap. Option 4 is definitely the worst. 

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

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

(Хотя, до TryParse, возможно, это был лучший вариант.)

  • Чтобы нарисовать подчеркивание под TextView в Android
  • Как я могу определить кодировку / кодовую страницу текстового файла
  • Как настроить кнопку UISwitch в iphone?
  • Как добавить разрыв строки в Android TextView?
  • Как читать и анализировать CSV-файлы на C ++?
  • Подчеркивание текста в UIButton
  • Тайм-аут в async / wait
  • Обосновать последнюю строку div?
  • андроидный эллипсовый многострочный текст
  • Можно ли изменить цвет текста в строке на несколько цветов в Java?
  • Подпиксельный сглаженный текст в элементе canvasа HTML5
  • Давайте будем гением компьютера.