尝试捕捉c#的性能

本文关键字:性能 | 更新日期: 2023-09-27 18:09:51

我对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;
    }
}

我觉得这可能是一个糟糕的做法,但我很好奇。

尝试捕捉c#的性能

我在上面的注释中提供的链接说明了当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相比,这是一个大约30000000%的性能改进。

(这不是一个严格的基准测试,有很多方法可以用不同的方式编写和运行它来获得更精确的数字,但这应该会让您很好地了解在任何可能的情况下使用if语句比try-catch更有效。)

虽然已经过去两年了,但它仍然具有相关性。

我尊重其他的回复,但我认为这里有一个基本的误解。Try Catch是c#和。net中的一种非常有效的方法,可以在开发和代码生命周期中识别错误。它从来没有打算成为一个使用不同的工具,如果它是火,这意味着你有一个bug需要修复。

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

作为标准,我用try-catch包装了我的所有方法,并添加了一个额外的功能,该功能将错误消息与方法的名称和额外的基本信息(如时间)以及一些有用的数据锚点写入调试文件,即使代码处于生产环境中,我也可以访问该文件。这是无价之宝!

就性能而言,如果try-catch没有触发(这应该是正常的),则不会降低性能,因为它只是一个简单的扭曲。如果某人真的追求高水平的性能,并且每个部分都很重要,那么可以使用预编译条件(# If…)来消除它。

希望对大家有帮助