2016-10-02 3 views
1

Мои знания с попыткой catch ограничены. Но мне интересно, можно ли его использовать для повышения производительности.попробуйте поймать за производительность C#

Пример, я создаю этот воксельный двигатель, где функция выглядит так:

Block GetBlockInChunk(Vector Position){ 
    if(InBound(Position)){ 
     return Database.GetBlock(); 
    } 
    return null; 
} 

Здесь он должен проверить пределы данной позиции, с использования попробовать поймать, то вы можете удалить их?

Block GetBlockInChunk(Vector Position){ 
    try{ 
     return Database.GetBlock(); 
    } 
    catch{ 
     return null; 
    } 
} 

Я чувствую, что это, вероятно, ужасная практика, но мне любопытно.

+0

'try..catch' вводит накладные расходы и не повышает производительность AFAIK. – user3185569

+1

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

+0

См. Http://stackoverflow.com/questions/8687113/if-condition-vs-exception-handler – Abion47

ответ

4

Ссылка, приведенная в приведенном выше комментарии, показывает описание того, почему вы никогда не должны использовать try-catch, если if-statement предотвратит выброс исключения, но в интересах показа производительности в терминах Фактически, я написал эту небольшую тестовую программу.

Stopwatch watch = new Stopwatch(); 

int[] testArray = new int[] { 1, 2, 3, 4, 5 }; 
int? test = null; 

watch.Start(); 
for (int i = 0; i < 10000; i++) 
{ 
    try 
    { 
     testArray[(int)test] = 0; 
    } 
    catch { } 
} 
watch.Stop(); 

Console.WriteLine("try-catch result:"); 
Console.WriteLine(watch.Elapsed); 
Console.WriteLine(); 

watch.Restart(); 
for (int i = 0; i < 10000; i++) 
{ 
    if (test != null) 
     testArray[(int)test] = 0; 
} 
watch.Stop(); 

Console.WriteLine("if-statement result:"); 
Console.WriteLine(watch.Elapsed); 

Результат программы заключается в следующем:

try-catch result: 
00:00:32.6764911 

if-statement result: 
00:00:00.0001047 

Как вы можете видеть, примерочную задвижку подход вводит значительные накладные расходы, когда исключение запутывается, принимая более 30 секунд, чтобы завершить 10000 циклов на моя машина. С другой стороны, if-statement работает так быстро, что он в основном мгновенен. По сравнению с попыткой, это улучшение производительности в районе 3 000 000%.

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

+1

* Stack trace * (если выбрано исключение) очень время при использовании (по сравнению с smple 'if') –

+0

Отличный ответ! 3 000 000% безумен! ха-ха – Vermacian55

Смежные вопросы