[英]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.