DivideByZeroException太慢了

Edu*_*rdo 7 .net c# performance exception division

这非常慢:

try
{
    x = k / y;
}
catch (DivideByZeroException) { }
Run Code Online (Sandbox Code Playgroud)

这大约快5倍:

if (y > 0) x = k / y;
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么?

Jon*_*eet 11

只快5倍?你让我感到惊讶.据推测,这意味着您的样本数据中没有很多零.

例外比简单的比较更昂贵.如果使用得当(例如在特殊情况下),它们不会显着妨碍性能 - 因为如果你投入足够的例外来产生重大影响,那么你的服务很可能已经被软化了.当您使用异常来尝试忽略您可以非常容易地测试的条件时,它确实会导致问题 - 就像这一样.

有关异常成本的一点需要注意:它们在调试器中的成本比没有附加调试器的情况下要多得多; 特别是需要加载一堆资源的第一个例外可能需要几秒而不是微/毫秒.如果您要对代码进行基准测试,那么在调试器中不这样做是至关重要的 - 这通常是正确的,但特别是对于异常.


Ode*_*ded 10

因为例外是昂贵的.

抛出异常时,运行时需要选择相当多的信息(例如堆栈跟踪)并将它们冒泡.这需要时间和资源,相比之下,0值的测试非常便宜.

请参阅此问题,询问有关更多信息的例外费用.


pax*_*blo 5

呃,因为异常比检查慢.例外通常围绕它们有很多基础设施,而简单的if声明则没有.

它们不是等效的操作,因为即使您选择不使用它,也会在异常中提供大量信息,因为在这种情况下.