電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 238|回復(fù): 0
收起左側(cè)

深入分析 C++ 錯(cuò)誤處理:哪種策略的性能最強(qiáng)?

[復(fù)制鏈接]

434

主題

434

帖子

3074

積分

四級會員

Rank: 4

積分
3074
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-23 09:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方“C語言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號
干貨福利,第一時(shí)間送達(dá)!
最近有小伙伴說沒有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,確實(shí)會一部分有小伙伴刷不到當(dāng)天的文章,一些比較實(shí)用的知識和信息,錯(cuò)過了就是錯(cuò)過了。所以建議大家加個(gè)星標(biāo)??,就能第一時(shí)間收到推送了。

在 C++ 開發(fā)中,錯(cuò)誤處理是一個(gè)至關(guān)重要的組成部分。不同的錯(cuò)誤處理策略不僅會影響代碼的可讀性和可維護(hù)性,還會對應(yīng)用程序的性能產(chǎn)生重大影響。為了深入了解各種錯(cuò)誤處理技術(shù)在性能上的差異,本文作者進(jìn)行了基準(zhǔn)測試。本次測試旨在提供清晰的性能洞察,幫助開發(fā)者在實(shí)際應(yīng)用中選擇最合適的錯(cuò)誤處理方法。
原文鏈接:https://johnfarrier.com/c-error-handling-strategies-benchmarks-and-performance/
錯(cuò)誤處理是許多 C++ 應(yīng)用程序中的關(guān)鍵部分,我們也有許多策略可以用來處理錯(cuò)誤。最近,我想更好地了解 C++ 中各種錯(cuò)誤處理技術(shù)對性能的影響。
1、C++ 錯(cuò)誤處理實(shí)驗(yàn)設(shè)置我決定對不同的技術(shù)進(jìn)行基準(zhǔn)測試,看看它們的性能如何。為此,我使用了 Celero C++ 微基準(zhǔn)測試庫,以此清楚地了解每種方法的性能。
例如,std::expected 在可讀性和可維護(hù)性方面有很多優(yōu)點(diǎn),同時(shí)考慮它的性能特征也很重要。通常,std::expected 比 exception(異常)更有效,因?yàn)樗苊饬硕褩U归_的開銷,而這在性能關(guān)鍵型應(yīng)用程序中可能非常重要。
我構(gòu)建了一個(gè)基準(zhǔn)測試來比較以下 C++ 錯(cuò)誤處理策略:
● 使用返回 true/false 表示成功/失。˙aseline)
● 使用錯(cuò)誤代碼(Error Code)返回值
● 使用 std::expected
● 使用 std::optional
● 使用 std::variant
● 使用 Callback
● 使用 std::exception
該 C++ 錯(cuò)誤處理基準(zhǔn)測試是用 Celero C++ 微基準(zhǔn)測試庫構(gòu)建的。關(guān)于 C++ 錯(cuò)誤處理基準(zhǔn)測試的具體代碼可查看:https://github.com/DigitalInBlue/celeroErrorHandlingBenchmark。
2、錯(cuò)誤處理實(shí)驗(yàn)結(jié)果以下是原始輸出結(jié)果:

為簡化起見,以下是這些技術(shù)相對性能的精簡版本:

在基線(Baseline) 歸一化性能的情況下,使用 std::expected 慢約 2.1 倍。
3、性能比較排除 std::exception 后,C++ 錯(cuò)誤處理基準(zhǔn)測試結(jié)果表明,各種錯(cuò)誤處理技術(shù)在性能上存在顯著差異:

● Baseline(基線) :基線方法是返回 true 或 false,是最快的技術(shù),平均每次迭代耗時(shí) 0.00324 微秒。
● std::expected:使用 std::expected 比基線慢約 2.18 倍,平均每次迭代耗時(shí) 0.00707 微秒。
● Error Code(錯(cuò)誤代碼):使用 Error Code 幾乎與基線一樣快,平均每次迭代耗時(shí) 0.00329 微秒。
● Optional:使用 std::optional 較慢,平均每次迭代耗時(shí) 0.00578 微秒,比基線慢約 1.78 倍。
● Variant:使用 std::variant 是非異常技術(shù)中最慢的,平均每次迭代耗時(shí) 0.00919 微秒,比基線慢約 2.83 倍。
● Error Callback(錯(cuò)誤回調(diào)):使用 Error Callback 對性能影響的中等,平均每次迭代耗時(shí) 0.00429 微秒,比基線慢約 1.32 倍。
● Exception(異常):使用 std::exception 明顯比所有其他技術(shù)都慢,平均每次迭代耗時(shí) 160.59420 微秒,比基線慢約 49,540 倍。
4、詳細(xì)分析和意見(1)可讀性與性能之間的權(quán)衡:
雖然 std::expected 和類似結(jié)構(gòu)(如 std::optional,std::variant)提供了更具可讀性和可維護(hù)性的代碼,但同時(shí)也帶來了相應(yīng)的性能成本。在可讀性和可維護(hù)性至關(guān)重要、而對性能要求不高的應(yīng)用程序中,這些結(jié)構(gòu)具有優(yōu)勢;然而,在對性能要求較高的應(yīng)用程序中,可能更偏向于使用簡單的錯(cuò)誤處理方法。
通常情況下,我們建議在整個(gè)應(yīng)用程序中選擇一種錯(cuò)誤處理方法,但有時(shí)可能也需要一種“默認(rèn)”的錯(cuò)誤處理方式(如使用 std::expected)和一種在特定情況下使用的“高性能”替代方案。
(2)不同情況下的錯(cuò)誤處理策略:
高性能系統(tǒng):對于需要高性能的系統(tǒng),如實(shí)時(shí)系統(tǒng)或高頻交易平臺,應(yīng)首選開銷最小的錯(cuò)誤處理技術(shù),如返回代碼或錯(cuò)誤回調(diào)。
現(xiàn)代 C++ 應(yīng)用程序:受益于現(xiàn)代 C++ 范式且對性能要求不太高的應(yīng)用程序,可以用 std::expected 和 std::optional 獲得更好的代碼表達(dá)能力。
(3)Exception(異常)的影響:
異常帶來的巨大開銷(比基線慢 49,540 倍)凸顯了為何在性能關(guān)鍵的代碼中避免使用異常的原因。異常處理期間的堆棧展開過程會導(dǎo)致相當(dāng)大的延遲。不過,異常對于處理應(yīng)用程序中對性能要求較低部分的意外或罕見錯(cuò)誤情況非常有用。
(4)基準(zhǔn)環(huán)境和條件:
需要注意的是,基準(zhǔn)測試可能會受到運(yùn)行環(huán)境的影響(例如,CPU,編譯器優(yōu)化等)。本文提供的結(jié)果是針對特定基準(zhǔn)條件下的結(jié)果,應(yīng)根據(jù)你的具體應(yīng)用進(jìn)行驗(yàn)證。
(5)內(nèi)存使用注意事項(xiàng):
雖然運(yùn)行時(shí)性能至關(guān)重要,但內(nèi)存使用也是一個(gè)重要因素;鶞(zhǔn)測試結(jié)果表明,大多數(shù)技術(shù)(不包括例外情況)的內(nèi)存使用情況相似,這說明錯(cuò)誤處理方法的選擇對內(nèi)存占用的影響可能微乎其微。
(6)可組合性和集成性:
std::expected 和 std::optional 與其他現(xiàn)代 C++ 特性集成得很好,可能會簡化復(fù)雜的錯(cuò)誤傳播場景。
5、關(guān)于 C++ 錯(cuò)誤處理的建議根據(jù)基準(zhǔn)測試結(jié)果,C++ 錯(cuò)誤處理技術(shù)的選擇應(yīng)由應(yīng)用程序的具體需求決定。以下是一些建議:
● 性能關(guān)鍵型應(yīng)用:使用簡單的錯(cuò)誤處理方法,如返回代碼或錯(cuò)誤回調(diào),盡量減少開銷。
● 現(xiàn)代、可維護(hù)的代碼:使用 std::expected 或 std::optional 以提高代碼的清晰度和可維護(hù)性,尤其是在可以接受輕度性能開銷的情況下。
● 異常處理:將異常保留給意外或不常發(fā)生的錯(cuò)誤,因需要全面的錯(cuò)誤信息,所以巨大的開銷也算合理。
這些 C++ 錯(cuò)誤處理基準(zhǔn)測試強(qiáng)調(diào)了根據(jù)應(yīng)用程序的性能需求選擇正確錯(cuò)誤處理技術(shù)的重要性。盡管 std::expected 和其他現(xiàn)代 C++ 特性提供了更好的可讀性和可維護(hù)性,但它們對性能的影響也不容忽視,尤其是在對性能要求極高的應(yīng)用程序中。
本文轉(zhuǎn)自公眾號“CSDN”,ID:CSDNnews——EOF——你好,我是飛宇。日常分享C/C++、計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)、工作體會,歡迎點(diǎn)擊此處查看我以前的學(xué)習(xí)筆記&經(jīng)驗(yàn)&分享的資源。
我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進(jìn)群交流。

歡迎你添加我的微信,我拉你進(jìn)技術(shù)交流群。此外,我也會經(jīng)常在微信上分享一些計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)以及工作體驗(yàn),還有一些內(nèi)推機(jī)會。


加個(gè)微信,打開另一扇窗
經(jīng)常遇到有讀者后臺私信想要一些編程學(xué)習(xí)資源,這里分享 1T 的編程電子書、C/C++開發(fā)手冊、Github上182K+的架構(gòu)路線圖、LeetCode算法刷題筆記等精品學(xué)習(xí)資料,點(diǎn)擊下方公眾號會回復(fù)"編程"即可免費(fèi)領(lǐng)取~

感謝你的分享,點(diǎn)贊,在看三  

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表