尝试捕获性能c#

时间:2016-10-02 18:40:10

标签: c# performance try-catch

我对try catch的了解有限。但我不知道它是否可以用来获得性能。

例如,我正在创建这个体素引擎,其中函数是这样的:

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

这里必须检查给定位置的边界,使用try catch,然后你可以删除它们吗?

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

我觉得这可能是一种可怕的做法,但我很好奇。

2 个答案:

答案 0 :(得分:4)

我在上面评论中提供的链接显示了当if语句阻止抛出异常时为什么不应该使用try-catch的描述,但是为了显示性能实际数字,我写了这个快速的小测试程序。

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

正如您所看到的,try-catch方法在捕获异常时会产生大量开销,在我的计算机上完成10,000个周期需要30秒以上。另一方面,if语句运行速度非常快,基本上是瞬时的。与try-catch相比,这是在3,000,000%附近的性能改进。

(这不是一个严格的基准测试,并且有一些方法可以编写它并以不同的方式运行它以获得更精确的数字,但是这应该可以让您更好地了解使用if的效率。 - 尽可能使用try-catch语句。)

答案 1 :(得分:0)

大约2年后,但这仍然有意义...

我尊重其他答复,但我认为出于尝试捕获的目的,这里存在一个基本的误解。在C#和dotnet中,Try Catch是一种非常有效的方法,可以在代码的开发和整个生命周期中识别错误。绝不打算将它用作使用其他工具的工具,如果遇到了麻烦,这意味着您有需要修复的错误。

要解决的问题是停止代码的标准错误消息,然后您需要进行深入研究。使用try and catch可以知道问题以哪种方法发生并缩小搜索范围。

作为标准,我用try-catch包装所有方法,并添加了附加功能,该错误功能会使用方法名称和其他基本信息(例如时间)将错误消息写入错误消息中,并将一些有用的数据锚定到调试文件中,即使代码正在生产中,我也可以访问。这是无价的!

就性能而言,如果try-catch不触发(应该正常),则不会降低性能,因为它只是一个简单的翘曲。如果某人确实对性能有很高的要求,并且每个方面都很重要,则可以使用预编译器条件(#if ...)消除它。

希望这会有所帮助。