2014-03-31 62 views
0

這些方法system_infosystem_flag每次我打電話給操作系統時,都會對系統調用嗎?還是他們使用Erlang虛擬機的存儲值?Erlang system_info和system_flag方法的行爲

任務:我正在編寫一個應用程序,它檢查閒置的處理器並創建新的進程來完成任務。如果這些方法正在進行系統調用,則可能會導致性能開銷。

回答

2

函數system_info和system_flag是調用erl_bif_info.c文件中的c代碼的BIF,該代碼不是NIF,所以調用它們不會導致長期運行的NIF可能出現的問題。

NIFS被認爲是有害的

  • 長期運行NIFS將接管調度,防止二郎從 有效地處理許多過程。
  • 如果運行時間短於幾微秒,短時運行的NIF仍會混淆調度器。

崩潰的NIF將取消您的虛擬機。

+0

您可以擴展更多的nifs。什麼時候使用它們是一個好主意?我經常使用基於nif的json解析器。我做出錯誤的選擇了嗎? –

+0

問題是JSON是一種效率非常低的數據結構(類似於對XML的低效率,儘管可能並不那麼糟糕)。如果你可以避免使用JSON,你可能應該。 MessagePack可以在很多情況下替換它。 – byaruhaf

+0

我認爲你在這裏略微抖動。 'system_info'和'system_flag'在你的意思上是** NOT ** NIF。如果使用正確,NIF非常有用。他們開始施加在系統上的時間限制是** MILLI **秒而不是微秒。當然,OTP團隊正在研究解決這個問題的方案,這會讓問題消失,變得骯髒的調度程序。 – rvirding

3

函數erlang:system_infoerlang:system_flag檢查和處理Erlang虛擬機而不是基礎OS。它們允許您檢查系統,看它是如何執行的,並以某種方式控制它。 BEAM是Erlang的虛擬機,它是一個複雜的野獸,有很多信息可供使用。另一個有用的功能是process_info它允許您獲取有關一個進程的信息。

雖然這些函數顯然是用C語言編寫的,但可以確定的是,調用它們並不會導致長期運行的NIF可能出現的問題。長時間運行意味着超過毫秒。同樣重要的是它們被多久調用一次以及是否通過相同的過程等。