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

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

相关推荐
热点推荐
新冠二次来袭,不发烧,身上 6 种信号一出,立刻去医院,别硬扛

新冠二次来袭,不发烧,身上 6 种信号一出,立刻去医院,别硬扛

普陀动物世界
2026-07-23 07:56:01
俄罗斯最先进的五代机苏57坠毁莫斯科!

俄罗斯最先进的五代机苏57坠毁莫斯科!

项鹏飞
2026-07-23 20:55:19
士兵伤亡增加、民调下滑,特朗普大举增兵中东意欲何为?

士兵伤亡增加、民调下滑,特朗普大举增兵中东意欲何为?

澎湃新闻
2026-07-23 19:22:27
6月1日起,男、女延长至70周岁!

6月1日起,男、女延长至70周岁!

微法官
2026-07-23 08:08:39
看到郑墨沫第五次被拒入境的消息!我第一反应不是惊讶,而是舒服

看到郑墨沫第五次被拒入境的消息!我第一反应不是惊讶,而是舒服

墨策史
2026-07-23 19:14:57
长沙曾琦医生入职浙大四院,担任专科专家,引发争议!网友:曾医生也算是因祸得福,看中她的“知名度”

长沙曾琦医生入职浙大四院,担任专科专家,引发争议!网友:曾医生也算是因祸得福,看中她的“知名度”

火山詩话
2026-07-22 08:09:06
国际体育诚信机构发预警:美加墨世界杯7场比赛有被操纵嫌疑

国际体育诚信机构发预警:美加墨世界杯7场比赛有被操纵嫌疑

全景体育V
2026-07-23 20:13:54
“瞧峰对瞄人缝”说:赵露思演唱会很有料!

“瞧峰对瞄人缝”说:赵露思演唱会很有料!

情感大头说说
2026-07-24 04:00:15
国产电池巨头,开始集中爆雷!

国产电池巨头,开始集中爆雷!

大佬灼见
2026-07-23 13:25:13
财长蓝佛安今天人民日报署名文章,读了三遍,信息量有点大

财长蓝佛安今天人民日报署名文章,读了三遍,信息量有点大

识局Insight
2026-07-23 13:59:05
金融圈大瓜!网传一证券公司女销售居家线上会议,忘关摄像头,其赤裸上身、刷牙洗漱的私密居家画面,被实时投射至会场大屏

金融圈大瓜!网传一证券公司女销售居家线上会议,忘关摄像头,其赤裸上身、刷牙洗漱的私密居家画面,被实时投射至会场大屏

火山詩话
2026-07-23 06:24:03
热议!滔搏回应暴力打折甩卖耐克库存,造成巨大负面影响

热议!滔搏回应暴力打折甩卖耐克库存,造成巨大负面影响

西昆仑Bruce
2026-07-23 18:23:22
中国外长缺席,日本外相被王毅晾一边,中方早看穿了他的小心思

中国外长缺席,日本外相被王毅晾一边,中方早看穿了他的小心思

健身狂人
2026-07-23 18:35:18
国民党不抗日,南京不战而降?传播此类谣言良知何在?

国民党不抗日,南京不战而降?传播此类谣言良知何在?

涛哥锐评
2026-07-23 07:40:07
打完菲律宾人才发现,中国海警手里拿的这是什么武器呀?

打完菲律宾人才发现,中国海警手里拿的这是什么武器呀?

阿龙聊军事
2026-07-23 10:55:06
历史首次!中国籍数学家同获菲尔兹奖 邱成桐:这是中国数学界几十年夙愿

历史首次!中国籍数学家同获菲尔兹奖 邱成桐:这是中国数学界几十年夙愿

红星新闻
2026-07-23 22:13:23
进入灭亡倒计时?韩国或将成为世界上,首个自然消失的国家

进入灭亡倒计时?韩国或将成为世界上,首个自然消失的国家

麓谷隐士
2026-07-22 07:00:03
甄珍哭着说:谢贤去年就认不得人了,反复问同一个问题,连老朋友都叫不出名字

甄珍哭着说:谢贤去年就认不得人了,反复问同一个问题,连老朋友都叫不出名字

情感大头说说
2026-07-23 17:39:55
辛柏青首次回应与吴越再婚,提起朱媛媛瞬间泪崩,一句话让人破防

辛柏青首次回应与吴越再婚,提起朱媛媛瞬间泪崩,一句话让人破防

小莜读史
2026-07-23 19:32:14
事发上海市区!黄鼠狼频繁出没,专往私家车里钻,发动机盖板被咬出大洞,还啃断线路、放臭屁

事发上海市区!黄鼠狼频繁出没,专往私家车里钻,发动机盖板被咬出大洞,还啃断线路、放臭屁

新民晚报
2026-07-23 11:48:56
2026-07-24 05:36:49
CSDN incentive-icons
CSDN
成就一亿技术人
26779文章数 242313关注度
往期回顾 全部

科技要闻

中国数学家王虹、邓煜获菲尔兹奖

头条要闻

四位菲尔兹奖得主三位会说中文 美国数学家曾参加汉语桥

头条要闻

四位菲尔兹奖得主三位会说中文 美国数学家曾参加汉语桥

体育要闻

勇士24岁的MVP,也是个勒布朗?

娱乐要闻

梁朝伟汤唯19年后境遇反转

财经要闻

梁文锋当不成赛博圣人

汽车要闻

满配华为乾崑六件套 东风奕派M8限时权益价16.58万起

态度原创

教育
时尚
亲子
数码
军事航空

教育要闻

今年高考“最强捡漏王”!429分上南方医科大,471分考入顶尖211

我花40万追的老公,被公司亲手毁了

亲子要闻

当你没动力运动时【周六野Zoey】

数码要闻

AMD发布第六代EPYC Venice CPU:台积电2nm工艺

军事要闻

"镐山"之后美再威胁袭伊基础设施 伊朗:将以牙还牙

无障碍浏览 进入关怀版