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

深入分析 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.

相关推荐
热点推荐
伊朗外长要求美国停止动武威胁

伊朗外长要求美国停止动武威胁

环球网资讯
2026-02-18 12:40:16
宝马CEO最新涉华表态:对中国庞大市场与创新潜力视而不见的人,正错失巨大机遇

宝马CEO最新涉华表态:对中国庞大市场与创新潜力视而不见的人,正错失巨大机遇

环球网资讯
2026-02-20 15:48:08
宜城烟花店燃烧之前,有网友拍到有人在门口放爆竹

宜城烟花店燃烧之前,有网友拍到有人在门口放爆竹

映射生活的身影
2026-02-20 10:59:08
阿勒代斯:图赫尔拿下贝林厄姆是在立规矩;10号位我选罗杰斯

阿勒代斯:图赫尔拿下贝林厄姆是在立规矩;10号位我选罗杰斯

懂球帝
2026-02-20 11:45:36
绝非迷信!正月初五,3事别犯了忌讳:1不拜、2不吵、3不吃

绝非迷信!正月初五,3事别犯了忌讳:1不拜、2不吵、3不吃

牛锅巴小钒
2026-02-20 18:34:32
举报《太平年》的人,到底在怕什么

举报《太平年》的人,到底在怕什么

勇哥读史
2026-02-19 10:10:16
国家为什么要在当下这个节点提出共同富裕?

国家为什么要在当下这个节点提出共同富裕?

流苏晚晴
2026-01-28 18:25:23
下黑手了!党内倒戈要求郑丽文下台

下黑手了!党内倒戈要求郑丽文下台

雪中风车
2026-02-20 15:02:04
“戏混子”没走,比资本家丑孩子更可怕的是“星二代”开始世袭了

“戏混子”没走,比资本家丑孩子更可怕的是“星二代”开始世袭了

流史岁月
2026-01-26 10:58:30
不可轻敌!武统台湾的难度远大于俄乌战争

不可轻敌!武统台湾的难度远大于俄乌战争

扶苏聊历史
2025-12-21 06:35:03
台湾即将有望统一!5大信号正在释放:武力统一或将进入倒计时?

台湾即将有望统一!5大信号正在释放:武力统一或将进入倒计时?

触摸史迹
2026-02-20 19:51:48
春节来新加坡旅游,被自己穷笑了:酒店一晚1.6万、入境被罚6000

春节来新加坡旅游,被自己穷笑了:酒店一晚1.6万、入境被罚6000

新加坡万事通
2026-02-17 18:29:48
在小县城名声很臭是啥体验?网友:脸皮够厚,一切不成问题

在小县城名声很臭是啥体验?网友:脸皮够厚,一切不成问题

解读热点事件
2026-02-04 00:05:07
52岁吴越独自在家包馄饨,素颜穿红色毛衣,为人低调朴素,很顾家

52岁吴越独自在家包馄饨,素颜穿红色毛衣,为人低调朴素,很顾家

东方不败然多多
2026-02-12 00:33:21
康熙临终前问谁可继位,周培公只用8个字,让康熙决心传位四阿哥

康熙临终前问谁可继位,周培公只用8个字,让康熙决心传位四阿哥

千秋文化
2026-02-08 19:35:47
幸亏还没结婚!一女生哭诉第一次去男友家过年,被他“冷落抛弃”

幸亏还没结婚!一女生哭诉第一次去男友家过年,被他“冷落抛弃”

火山詩话
2026-02-20 08:39:05
1967年广州海关截获两只老鼠,检测数据让专家后背发凉:这哪是耗子,分明是冲着原子弹来的

1967年广州海关截获两只老鼠,检测数据让专家后背发凉:这哪是耗子,分明是冲着原子弹来的

老杉说历史
2026-01-06 21:05:15
3天4金强逆袭!冬奥会金牌榜大洗牌,中国队目标:冲6金绝杀日本

3天4金强逆袭!冬奥会金牌榜大洗牌,中国队目标:冲6金绝杀日本

大秦壁虎白话体育
2026-02-21 00:18:15
智谱7天暴涨250%,徐新爆赚30倍,股民高呼离谱!韩国散户竟是爆炒推手?

智谱7天暴涨250%,徐新爆赚30倍,股民高呼离谱!韩国散户竟是爆炒推手?

金石随笔
2026-02-20 22:58:08
Z世代购物车|“90分钟卖了16万元”,年轻人为何爱上盘中药手串?

Z世代购物车|“90分钟卖了16万元”,年轻人为何爱上盘中药手串?

中新经纬
2026-02-20 12:26:33
2026-02-21 01:44:49
CSDN incentive-icons
CSDN
成就一亿技术人
26330文章数 242232关注度
往期回顾 全部

科技要闻

莫迪举手欢呼 两大AI掌门人却握拳尴尬对峙

头条要闻

贝加尔湖遇难者遗体已被发现 涉事司机系私下接单

头条要闻

贝加尔湖遇难者遗体已被发现 涉事司机系私下接单

体育要闻

金牌夫妻!王心迪徐梦桃赛后拥抱太甜了

娱乐要闻

《将门独后》开拍,王鹤棣孟子义主演

财经要闻

特朗普全球关税被推翻!有何影响?

汽车要闻

比亚迪的“颜值担当”来了 方程豹首款轿车路跑信息曝光

态度原创

旅游
亲子
数码
本地
军事航空

旅游要闻

游人如织,新天地解锁马年最热闹的新春模样

亲子要闻

春节儿童吃撑了怎么办?家长可用山楂、麦芽煮水代茶饮

数码要闻

AMD "Zen 6" MSDT主流桌面处理器被曝最快2027年推出

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

军事要闻

消息人士透露:美军赴黄海活动 解放军有效应对处置

无障碍浏览 进入关怀版