2011-12-25 20 views
3

我的問題很簡單:我想知道處理器是否嘗試以某種方式幫助異常處理。如果在設計處理器「異常就緒」時有足夠的努力,是否有可能完全消除異常處理和投擲的開銷?處理器是否有實際的電路來幫助異常處理?

因爲據我所知,所有異常處理都是通過軟件來完成的,而且這總是會增加一些開銷。我錯了嗎?

- 編輯

所以,感謝下面的所有答案。我很感激。你已經回答了我的問題。

但是我只是想澄清一下爲什麼我這樣問:一般來說,人們不會過分深入優化異常,因爲他們都認爲「異常是爲了特殊情況」,因此它們不是瓶頸。

我不認爲只有在戲劇性的情況下才會拋出異常。我認爲,基本上,任何時候一個函數都不能遵守它承諾做的事情時應該拋出一個異常。

如果我說:

doSomethingImportant(); 

而且如果任何原因「重要的事情」不能這樣做,這應該拋出異常。

當然,doSomethingImportant()可能無法遵守,因爲系統內存不足(一個戲劇性的問題),但我認爲我們應該能夠建立更簡單的模型「我現在不能這樣做/現在,抱歉「進入我們的軟件,嵌入到我們的設計中。我想說,我認爲例外可以是例外,是的,但他們預計像正常的軟件流程,而不是作爲系統必須「恢復」,nomsain「致命錯誤」?

雖然通過漂亮的數據中心支持大的應用程序將未落瓶頸,因爲異常處理,請不要忘記還有市場在資源計算的嵌入式設備,和異常處理產生影響(這是什麼我瞄準)。

我個人覺得異常很有表現力,我想在嵌入式設備中使用它們,儘可能多的「開銷」,因爲我會返回「-1」並用「if」來檢查它。

+1

異常總是會很慢,因爲它們按照定義*異常*,而使事情快速的方法是針對常見情況進行優化,而不是例外情況。 – hobbs 2011-12-25 08:11:17

回答

3

指令集架構文檔,例外是處理器的異常情況(如零鴻溝,非法指令,等等)。它們通常被翻譯爲中斷(但大多數中斷是外部信號到處理器)。

編程語言規格,例外的非本地控制流結構,通常涉及某種形式的調用堆棧展開的。我相信最近的微體系結構特別處理棧指針0​​(例如w.r.t.緩存和指令調度)。他們可能有一些專用於編程語言異常所需的棧指針更改的電路。

一些語言和實現比其他語言和實現具有更好的異常語義和機器。例如,Ocaml異常處理比C++更快(至少使用GCC編譯器)。

+0

清晰,簡潔,沒有偏見就像我原來的問題。感謝:D – 2011-12-25 11:53:04

1

我不相信他們這樣做,至少目前不是。異常處理不是機器代碼的一部分,它是高級語言的一個特性,它可以通過寄存器和調用堆棧,中斷和其他事情很容易地實現......而編譯器可以選擇實現異常處理它想要。

所以,它總是會增加一些開銷。但是,我並沒有在很多情況下將異常處理添加到任何CPU指令集中。例外情況是特殊情況;如果它們導致性能問題被過多拋出,那麼代碼中就會出現錯誤。

2

通常有兩種類型的異常處理:

  1. 的語言異常。 (你用C++/Java或任何其他語言所拋出的那種)
  2. 硬件異常。 (信號,段錯誤,未對齊等)

我假設你在談論第一個問題。截至目前,我不認爲任何處理器都有這種支持。儘管我不是硬件設計師,但我的理由是爲什麼會出現這種情況,以及爲什麼異常處理可能永遠不會在硬件中實現。

  1. 不同的語言有不同的異常處理協議。 C++可能與Java,C#等不同......堆棧展開和析構函數調用會使此過程複雜化。
  2. 異常處理是一個瓶頸嗎?大多數高度優化的HPC性能關鍵型應用程序無論如何都不使用異常處理。大多數依賴於異常處理的面向OOP的代碼通常都會受到其他因素的阻礙。 (如分支,緩存,內存等)

因此,添加對異常處理的硬件支持並不能真正幫助正確的用戶羣。