簡體   English   中英

在沒有命中時,C ++中的try catch是否會影響性能

[英]Does try catch in C++ affect performance when not hit

我有代碼,其中函數中有try catch,函數被命中。 100次以上。 代碼每次都會提前返回,而不會實際觸及try catch。 這是否會影響Visual Studio的性能。 我看到了性能影響。

我的代碼是:

void foo(int a) {
 if (a > value) {
    return;
 }
 try {
    possibleErrorFunction();
 } catch {
 }
}

我改成了:

void foo(int a) {
if (a > value) {
    return;
}
bar();
}

void bar() {
try {
    possibleErrorFunction();
} catch {
}
}

第二個代碼似乎快了大約10秒。 對此有任何可以解釋的解釋嗎?

異常機制實現中使用了兩個主要策略。 一個是所謂的“基於幀”或“動態”,另一個是“基於表格”。 其他方案是這兩者的變體。 你可以在這里閱讀更多相關信息

本質上,“基於幀”的動態實現確實在運行時將每個條目的資源花費在try塊上和從try塊中退出。 如果不拋出異常但是它使用了更多的內存,那么“基於表”的機制不涉及任何額外的工作。

我不是100%肯定,但據我所知Microsoft編譯直到VS2008使用“基於幀”的方法,並從VS2010開始實現“基於表”的方法。 (也許有一些編譯器開關可以控制它 - 我不知道,因為我個人不希望在現有代碼或第三方庫強制之前不使用異常)。 我想你可以在編譯器文檔中找到這些信息。

您還可以從c ++源代碼生成匯編代碼,以查看try塊的運行情況

所有上述評論似乎都趨向於有用的一兩點。 額外的設備總是會占用更多的CPU周期,從而貶低性能(我不相信這個編輯框被標記為“貶義”)。 需要在許多實例上進行許多迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM