网易首页 > 网易号 > 正文 申请入驻

深入分析 C++ 错误处理:哪种策略的性能最强?

0
分享至

在 C++ 开发中,错误处理是一个至关重要的组成部分。不同的错误处理策略不仅会影响代码的可读性和可维护性,还会对应用程序的性能产生重大影响。为了深入了解各种错误处理技术在性能上的差异,本文作者进行了基准测试。本次测试旨在提供清晰的性能洞察,帮助开发者在实际应用中选择最合适的错误处理方法。

原文链接:https://johnfarrier.com/c-error-handling-strategies-benchmarks-and-performance/

声明:未经允许,禁止转载。

作 者 | John Farrier

翻译 | 郑丽媛

错误处理是许多 C++ 应用程序中的关键部分,我们也有许多策略可以用来处理错误。最近,我想更好地了解 C++ 中各种错误处理技术对性能的影响。

C++ 错误处理实验设置

我决定对不同的技术进行基准测试,看看它们的性能如何。为此,我使用了 Celero C++ 微基准测试库,以此清楚地了解每种方法的性能。

例如,std::expected 在可读性和可维护性方面有很多优点,同时考虑它的性能特征也很重要。通常,std::expected 比 exception(异常)更有效,因为它避免了堆栈展开的开销,而这在性能关键型应用程序中可能非常重要。

我构建了一个基准测试来比较以下 C++ 错误处理策略:

● 使用返回 true/false 表示成功/失败(Baseline)

● 使用错误代码(Error Code)返回值

● 使用 std::expected

● 使用 std::optional

● 使用 std::variant

● 使用 Callback

● 使用 std::exception

该 C++ 错误处理基准测试是用 Celero C++ 微基准测试库构建的。关于 C++ 错误处理基准测试的具体代码可查看:https://github.com/DigitalInBlue/celeroErrorHandlingBenchmark。

错误处理实验结果

以下是原始输出结果:

为简化起见,以下是这些技术相对性能的精简版本:

在基线(Baseline) 归一化性能的情况下,使用 std::expected 慢约 2.1 倍。

性能比较

排除 std::exception 后,C++ 错误处理基准测试结果表明,各种错误处理技术在性能上存在显著差异:

● Baseline(基线) :基线方法是返回 true 或 false,是最快的技术,平均每次迭代耗时 0.00324 微秒。

● std::expected:使用 std::expected 比基线慢约 2.18 倍,平均每次迭代耗时 0.00707 微秒。

● Error Code(错误代码):使用 Error Code 几乎与基线一样快,平均每次迭代耗时 0.00329 微秒。

● Optional:使用 std::optional 较慢,平均每次迭代耗时 0.00578 微秒,比基线慢约 1.78 倍。

● Variant:使用 std::variant 是非异常技术中最慢的,平均每次迭代耗时 0.00919 微秒,比基线慢约 2.83 倍。

● Error Callback(错误回调):使用 Error Callback 对性能影响的中等,平均每次迭代耗时 0.00429 微秒,比基线慢约 1.32 倍。

● Exception(异常):使用 std::exception 明显比所有其他技术都慢,平均每次迭代耗时 160.59420 微秒,比基线慢约 49,540 倍。

详细分析和意见

(1)可读性与性能之间的权衡:

虽然 std::expected 和类似结构(如 std::optional,std::variant)提供了更具可读性和可维护性的代码,但同时也带来了相应的性能成本。在可读性和可维护性至关重要、而对性能要求不高的应用程序中,这些结构具有优势;然而,在对性能要求较高的应用程序中,可能更偏向于使用简单的错误处理方法。

通常情况下,我们建议在整个应用程序中选择一种错误处理方法,但有时可能也需要一种“默认”的错误处理方式(如使用 std::expected)和一种在特定情况下使用的“高性能”替代方案。

(2)不同情况下的错误处理策略:

高性能系统:对于需要高性能的系统,如实时系统或高频交易平台,应首选开销最小的错误处理技术,如返回代码或错误回调。

现代 C++ 应用程序:受益于现代 C++ 范式且对性能要求不太高的应用程序,可以用 std::expected 和 std::optional 获得更好的代码表达能力。

(3)Exception(异常)的影响:

异常带来的巨大开销(比基线慢 49,540 倍)凸显了为何在性能关键的代码中避免使用异常的原因。异常处理期间的堆栈展开过程会导致相当大的延迟。不过,异常对于处理应用程序中对性能要求较低部分的意外或罕见错误情况非常有用。

(4)基准环境和条件:

需要注意的是,基准测试可能会受到运行环境的影响(例如,CPU,编译器优化等)。本文提供的结果是针对特定基准条件下的结果,应根据你的具体应用进行验证。

(5)内存使用注意事项:

虽然运行时性能至关重要,但内存使用也是一个重要因素。基准测试结果表明,大多数技术(不包括例外情况)的内存使用情况相似,这说明错误处理方法的选择对内存占用的影响可能微乎其微。

(6)可组合性和集成性:

std::expected 和 std::optional 与其他现代 C++ 特性集成得很好,可能会简化复杂的错误传播场景。

关于 C++ 错误处理的建议

根据基准测试结果,C++ 错误处理技术的选择应由应用程序的具体需求决定。以下是一些建议:

● 性能关键型应用:使用简单的错误处理方法,如返回代码或错误回调,尽量减少开销。

● 现代、可维护的代码:使用 std::expected 或 std::optional 以提高代码的清晰度和可维护性,尤其是在可以接受轻度性能开销的情况下。

● 异常处理:将异常保留给意外或不常发生的错误,因需要全面的错误信息,所以巨大的开销也算合理。

这些 C++ 错误处理基准测试强调了根据应用程序的性能需求选择正确错误处理技术的重要性。尽管 std::expected 和其他现代 C++ 特性提供了更好的可读性和可维护性,但它们对性能的影响也不容忽视,尤其是在对性能要求极高的应用程序中。

关于 LINUX 的资料浩如烟海,学习 LINUX 的途径也有很多,如何才能在比较短的时间里获得一个比较大的提升呢?《LINUX 平台高级调试与优化》将与各位 LINUX 爱好者共同探索这个问题的最佳答案。

本着生动有趣、理论与实践密切结合的原则,本研习班独辟蹊径,使用调试之剑披荆斩棘,带你闯荡纷繁复杂的 LINUX 世界。本研习班由《软件调试》、《软件简史》和《格蠹汇编》的作者张银奎主讲。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
哈维:我当时100%赞成梅西回归巴萨,但拉波尔塔叫停了转会

哈维:我当时100%赞成梅西回归巴萨,但拉波尔塔叫停了转会

懂球帝
2026-09-20 04:46:35
普京时代即将进入倒计时,中国必须警惕俄罗斯政策突变!

普京时代即将进入倒计时,中国必须警惕俄罗斯政策突变!

扶苏聊历史
2026-09-18 18:11:52
CCTV5直播!亚运会首日比赛:中国三大球全出击,女排冲四强,男足争小组第一,男篮荣誉战

CCTV5直播!亚运会首日比赛:中国三大球全出击,女排冲四强,男足争小组第一,男篮荣誉战

篮球圈里的那些事
2026-09-19 18:28:37
女子怀疑医生在其子宫装监听器,手机一放歌就异常!两次告上法庭

女子怀疑医生在其子宫装监听器,手机一放歌就异常!两次告上法庭

砚田文化
2026-09-18 08:34:48
月球上遍地是土,却没人敢随便挖一锹。为什么?因为那层4米厚的月壤,压根不是普通泥土,而是太阳系40亿年演化留下的“黑匣子”

月球上遍地是土,却没人敢随便挖一锹。为什么?因为那层4米厚的月壤,压根不是普通泥土,而是太阳系40亿年演化留下的“黑匣子”

扶苏聊历史
2026-09-18 15:26:02
一人拖垮全剧!《交锋》这位空降兵沦为败笔,央视力捧也无济于事!

一人拖垮全剧!《交锋》这位空降兵沦为败笔,央视力捧也无济于事!

小椰的奶奶
2026-09-20 03:23:40
被骂尺度太大?池昌旭林珍娜的大胆出演,藏着最纯粹的演员初心

被骂尺度太大?池昌旭林珍娜的大胆出演,藏着最纯粹的演员初心

传递满满正能量
2026-09-19 06:08:21
何时追上特斯拉FSD?朱江明:没有可比性,中国车不能到美国,特斯拉FSD也还没在中国落地

何时追上特斯拉FSD?朱江明:没有可比性,中国车不能到美国,特斯拉FSD也还没在中国落地

和讯网
2026-09-17 14:17:04
11月15日起北京全域禁存无人机,大疆的麻烦才刚开始

11月15日起北京全域禁存无人机,大疆的麻烦才刚开始

ZAKER新闻
2026-09-17 21:25:08
哈维:位置前提改变了我的生涯;伊布在巴萨问题是与瓜帅不和

哈维:位置前提改变了我的生涯;伊布在巴萨问题是与瓜帅不和

懂球帝
2026-09-20 04:35:34
仅仅一个西藏,居然就能满足中国现在与未来,几乎所有的能源需求

仅仅一个西藏,居然就能满足中国现在与未来,几乎所有的能源需求

抽象派大师
2026-09-19 16:06:21
就在今天,中菲在仙宾礁爆发冲突,菲方先动手了,美国介入很快

就在今天,中菲在仙宾礁爆发冲突,菲方先动手了,美国介入很快

霁寒飘雪
2026-09-19 11:56:32
越南印度两条命脉,一夜全断!中国紧急开门,不是接单,是救命!

越南印度两条命脉,一夜全断!中国紧急开门,不是接单,是救命!

乌克兰小静
2026-09-19 09:06:32
太荒唐!亚运会刚开始,恶心一幕出现,中国队还没比赛就被淘汰

太荒唐!亚运会刚开始,恶心一幕出现,中国队还没比赛就被淘汰

傲傲讲历史
2026-09-19 04:46:44
斯诺克疯狂一夜,诞生四场六连鞭,常冰玉、斯佳辉制造惨案,中国5胜4负,小白有望创历史

斯诺克疯狂一夜,诞生四场六连鞭,常冰玉、斯佳辉制造惨案,中国5胜4负,小白有望创历史

体坛最前线66
2026-09-19 21:18:14
瞒不住了!抵达日本2天后,王楚钦说出退赛真相,颠覆所有人猜想

瞒不住了!抵达日本2天后,王楚钦说出退赛真相,颠覆所有人猜想

阿器谈史
2026-09-19 22:21:42
毛东东随团访朝 向毛岸英铜像祭酒 背后释放的信号不简单

毛东东随团访朝 向毛岸英铜像祭酒 背后释放的信号不简单

军武咖
2026-09-19 08:59:52
全世界都被普京骗了?打乌克兰只是幌子,真正目标其实已悄悄布局四年

全世界都被普京骗了?打乌克兰只是幌子,真正目标其实已悄悄布局四年

扶苏聊历史
2026-08-27 16:15:02
正式签约!4年6000万!字母哥等来最强帮手

正式签约!4年6000万!字母哥等来最强帮手

篮球教学论坛
2026-09-20 00:23:52
蓝军弃帅扬眉吐气!重返法甲带队5轮不败 高居联赛第2

蓝军弃帅扬眉吐气!重返法甲带队5轮不败 高居联赛第2

球事百科吖
2026-09-20 04:02:57
2026-09-20 05:08:49
CSDN incentive-icons
CSDN
成就一亿技术人
26973文章数 242334关注度
往期回顾 全部

科技要闻

要走650亿,智谱的理想越来越贵

头条要闻

厨师被指在餐馆扎血测艾滋病 老板:有关部门已介入

头条要闻

厨师被指在餐馆扎血测艾滋病 老板:有关部门已介入

体育要闻

2026亚运会开幕式 胡明轩吴愉担任旗手

娱乐要闻

甜度爆表!许嵩冯禧晒婚纱照官宣结婚

财经要闻

江西首富破产:一张927万商票压垮千亿帝国

汽车要闻

大块头的从容 红旗G919如何兼顾豪华与越野能力

态度原创

教育
艺术
游戏
亲子
军事航空

教育要闻

“为了点补贴,把孩子未来毁了!”单亲妈妈奇葩操作,网友:孩子长大肯定恨你

艺术要闻

国宝级!石涛书画全集大公开,搜尽奇峰打草稿,这才是中国画天花板!

玩家称DLSS5"纯粹是来恶心主机的" 主机或迎成本挑战

亲子要闻

从“世界高品质”到“透明真安心”,好奇诠释48年品质坚守

军事要闻

特朗普再称对伊朗战争将很快结束

无障碍浏览 进入关怀版