Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,即使从未抛出异常,使用try-catch块的代价是否高昂?_Javascript_Performance_Exception_Try Catch - Fatal编程技术网

在Javascript中,即使从未抛出异常,使用try-catch块的代价是否高昂?

在Javascript中,即使从未抛出异常,使用try-catch块的代价是否高昂?,javascript,performance,exception,try-catch,Javascript,Performance,Exception,Try Catch,在没有抛出异常的情况下,使用几个try-catch块是否“缓慢”?我的问题与相同,但针对JavaScript 假设我有20个函数,其中包含try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢还是执行得更差?据说try-catch块很昂贵。但是,如果关键性能不是一个问题,那么使用它不一定是一个问题 国际海事组织的处罚是: 可读性 在许多情况下是不合适的 在异步编程方面无效 可读性:用大量的try-catch编写代码

在没有抛出异常的情况下,使用几个try-catch块是否“缓慢”?我的问题与相同,但针对JavaScript


假设我有20个函数,其中包含try-catch块,另一个函数调用这20个函数中的每一个,其中没有一个抛出异常。我的代码会因为这个try-catch块而执行得更慢还是执行得更差?

据说try-catch块很昂贵。但是,如果关键性能不是一个问题,那么使用它不一定是一个问题

国际海事组织的处罚是:

  • 可读性
  • 在许多情况下是不合适的
  • 在异步编程方面无效
可读性:用大量的try-catch编写代码既难看又令人分心

不合适:如果代码没有发生异常崩溃,那么插入这样的块是个坏主意。仅当您希望代码中出现故障时才插入它。请看以下主题:

异步:
try-catch
块是同步的,在
Async
编程时无效。在
ajax
请求期间,您可以在专用回调中处理
错误
成功
事件。不需要
尝试catch

希望这有帮助


R.

您正在编写典型的CRUD UI代码吗?使用try-catch,使用在代码中无缘无故地散布到10000的循环,见鬼,使用angular/ember-您不会注意到任何性能问题

如果你在做低级库、物理模拟、游戏、服务器端等,那么从不抛出try-catch块通常根本不重要,但问题是直到引擎版本6,V8才在优化编译器中支持它,因此,语法上包含try-catch的整个包含函数将不会得到优化。不过,您可以通过创建类似于
tryCatch
的辅助函数轻松解决此问题:

function tryCatch(fun) {
    try {
        return fun();
    }
    catch(e) {
        tryCatch.errorObj.e = e;
        return tryCatch.errorObj;
    }
}
tryCatch.errorObj = {e: null};


var result = tryCatch(someFunctionThatCouldThrow);
if(result === tryCatch.errorObj) {
    //The function threw
    var e = result.e;
}
else {
    //result is the returned value
}

在V8版本6(与Node 8.3和最新Chrome一起提供)之后,
try-catch
中的代码性能与普通代码的性能相同。

最初的问题是关于在没有抛出错误时try/catch的成本。当使用try/catch保护代码块时,肯定会产生影响,但是try/catch的影响会很快消失,因为被保护的代码甚至变得稍微复杂

考虑这个测试:

一个简单的增量以每秒356800000次迭代的速度运行 try/catch中的相同增量为每秒93500000次迭代。这是由于try/catch造成的75%的开销。 但是,一个微不足道的函数调用以每秒112200000次迭代的速度运行。 2个普通函数调用以每秒61300000次迭代的速度运行

在这个测试中,一次未执行的尝试所花费的时间比一次简单的函数调用稍多。这几乎不是一个重要的速度惩罚,除了在像FFT这样非常激烈的东西的最内部循环中

您希望避免的情况是实际引发异常的情况。如上面的链接所示,速度要慢得多


编辑:这些数字是我机器上Chrome的。在Firefox中,未经授权的尝试和完全没有保护之间没有显著区别。如果没有抛出异常,使用try/catch基本上是零惩罚。

我试图根据具体的基准测试结果提供答案。为此,我编写了一个简单的基准测试,将try-catch与各种if-else条件进行比较,从简单到更复杂。我知道,根据平台的不同,基准可能会有很大的变化。如果您得到不同的结果,请发表评论。看

首先,我尝试在这里以紧凑的方式表示测试套件。有关详细信息,请参见上面的链接。有四个测试用例,稍后由(索引)引用:

  • (1) 尝试调用函数
    lib.foo
    的catch块,并使用一些三角数学。不会抛出任何错误
  • (2) if-else块,通过lib中的'foo'检查函数是否存在,然后调用函数
  • (3) if-else块,通过
    typeof lib['foo']=='function'
    检查函数是否存在,然后调用函数
  • (4) if else块,通过
    Object.prototype.hasOwnProperty.call(lib,'foo')
    检查函数是否存在,然后调用函数
我在Chrome87上运行了几次基准测试。尽管实际数字不时发生变化,但结果是一致的,可以大致概括如下:

  • try-catch(1)和if-else(2)在运行时几乎相等。试捕(2)有时会慢1%到2%
  • if-else(3)比try-catch(1)或if-else(2)慢75%
  • if-else(4)比try-catch(1)或if-else(2)慢90%
澄清一下,75%的速度慢意味着如果最快的情况需要1.0秒,那么75%的速度慢的执行需要1.75秒

作为结论,在从不抛出错误的情况下使用try-catch似乎与检查任何简单条件一样有效。如果情况更复杂,try-catch的速度明显更快

作为个人说明,这个结论与我在大学里学到的东西是一致的。虽然它是在C++的背景下,但同样的道理似乎也适用于此。如果我没记错的话,我的讲师说try块的设计非常高效,几乎是看不见的效率。然而,这是一个很慢的拦网,我的意思是真的很慢。如果抛出错误,则使用catch块进行处理所花费的时间比使用If-else块所能实现的时间长数百倍甚至数千倍。因此,请将例外情况保持在例外状态。

@Chase:bu