Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

避免在性能敏感的代码中抛出异常

Posted on 2022-05-14

肖像2018facebook.jpg

软件中有多种方法来处理错误情况。在 C 或 Go 中,返回错误代码。其他编程语言如 C++ 或 Java 更喜欢抛出异常。使用异常的一个好处是它可以使您的代码大部分保持干净,因为错误处理代码通常是分开的。

处理异常是否比处理错误代码更好是有争议的。我会很乐意使用其中一个。

然而,我反对的是在控制流中使用异常。意外地无法打开文件时抛出异常是可以的。但是您不应该使用异常来对值的类型进行分支。

让我来说明一下。

假设我的代码期望整数总是正数。然后我可能有一个检查这种情况的函数:

 int get_positive_value ( int x ) {      if ( x < 0 ) { throw std :: runtime_error ( "它不是正数! " ) ; }      返回x ;  }  

到现在为止还挺好。我假设通常永远不会抛出异常。如果我有某种错误,它会被抛出。

如果我想对数组中包含的整数的绝对值求和,则可以使用以下分支代码:

整数总和= 0 ;      对于( int x : a ) {          如果( x < 0 ) {              总和+ = - x ;          }其他{              总和+ = x ;          }      }    

不幸的是,我经常看到滥用异常的解决方案:

整数总和= 0 ;      对于( int x : a ) {          试试{              总和+ = get_positive_value ( x ) ;          }抓住( ... ) { _              总和+ = - x ;          }      }  

后者显然是丑陋且难以维护的代码。但更重要的是,它可能非常低效。为了说明,我针对包含几千个元素的随机数组编写了一个小型基准测试。我在 Skylake 处理器上使用 LLVM clang 12 编译器。在我的测试中,普通代码要快 10000 倍!

普通代码 0.05 ns/值
例外 500 纳秒/值

您的结果会有所不同,但通常情况下,将异常用于控制流会导致性能欠佳。而且也很丑!

原文: https://lemire.me/blog/2022/05/13/avoid-exception-throwing-in-performance-sensitive-code/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Elad Gil
  • Ellie Huxtable
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Lou Plummer
  • Matt Stoller
  • Mert Bulan
  • Mostly metrics
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • Thinking Deep & Wide
  • Tim Kellogg
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme