要求许可或道歉?

the*_*oom 12 c# python performance

我来自python背景,经常说道歉比要求许可更容易道歉.特别给出了两个片段:

if type(A) == int:
  do_something(A)
else:
  do_something(int(A))

try:
  do_something(A)
except TypeError:
  do_something(int(A))
Run Code Online (Sandbox Code Playgroud)

然后在大多数使用场景下,当A通常是一个整数时假设第二个会更快(假设do_something需要一个整数作为输入并且会相当迅速地提高它的异常),因为你从每个执行循环中丢失了逻辑测试,代价是更多昂贵的例外,但不那么频繁.

我想要检查的是在C#中这是否正确,或者逻辑测试与异常相比是否足够快以使其成为一个小角落?

哦,我只对发布性能感兴趣,而不是调试.


好吧,我的例子太模糊了试试这个:

天真的解决方案:

return float(A) % 20 # coerse A to a float so it'll only fail if we actually don't
                     # have anything that can be represented as a real number.
Run Code Online (Sandbox Code Playgroud)

逻辑解决方案:

if isinstance(A, Number): # This is cheaper because we're not creating a new
    return A % 20         # object unless we really have to.
else:
    return float(A) %20
Run Code Online (Sandbox Code Playgroud)

基于异常的解决方案:

try: # Now we're doing any logical tests in the 99% of cases where A is a number
  return A % 20
except TypeError:
  return float(A) % 20
Run Code Online (Sandbox Code Playgroud)

使用FSO,数据库连接或网络上的内容的示例更好,但对于一个问题有点啰嗦.

jal*_*alf 15

可能不是..NET异常相对昂贵.

由于这个原因,一些.NET函数提供了两种变体.(int.TryParse通常建议返回成功代码,因为它比int.Parse失败时抛出异常更快)

但唯一重要的答案是您自己的分析数据告诉您的.如果您需要表现,则需要进行测量,测量和测量.

因为什么是最快的在我的电脑,用我的代码,用我的版本的.NET框架,在这个时间可能不会在您的计算机上最快的,与你的你的代码的时候,用你的.NET framework版本,在当时阅读.


dtb*_*dtb 7

.NET中的异常是相当重要的,因此C#中的哲学是仅在异常情况下使用异常,而不是程序流.

C#中的哲学也适用于在使用之前检查从外部代码接收的所有输入.例:

public void Foo(int i)
{
    if (i == 0)           // validate input received from external code
    {
        throw new ArgumentOutOfRangeException("i");
    }

    DoSomething(i);
}

public void Foo()
{
    DoSomething(1);
}

internal void DoSomething(int i)
{
    Debug.Assert(i != 0); // validate that i is not zero in DEBUG build
                          // assume that i is not zero in RELEASE build

    Console.WriteLine(42 / i);
}
Run Code Online (Sandbox Code Playgroud)


mdm*_*mdm 6

根据经验,我会说异常不应该用于流量控制.在特殊情况下使用异常 - 所以如果你确实期望A是一个int,那么你的第一种方法是明智的.如果它可以是int或字符串,则第二个更具可读性.

在性能方面,发布版本存在差异 - 合理的逻辑测试肯定足够快 - 所以我个人认为可读性.

  • 提问者是C#的新手,正在寻求经验丰富,知识渊博的C#用户的建议.如果我是提问者,或随机谷歌搜索者,那么我完全了解我选择的*附带*后果是很重要的.在回答问题时,通常会注意到提问者不知道但需要知道的任何警告.即:在C#中不赞成使用流控制的异常. (3认同)
  • 那么经验法则标签呢?我只是想提供一个平衡的答案.很明显,我不会赢得你,所以我们必须同意不同意. (2认同)