1. 程式人生 > >系統技術非業餘研究 » R14A新增新指令優化Ref訊息的接收

系統技術非業餘研究 » R14A新增新指令優化Ref訊息的接收

Erlang的慣用法之一就是在訊息匹配的時候,如果需要唯一性,通常會通過make_ref搞個唯一的Ref來作為訊息的一部分來匹配。這個慣用法用在gen_server:call或者demonitor這樣的使用頻度很高的函式裡面。由於erlang的訊息匹配是再訊息佇列裡面挨個遍歷來匹配,特別是訊息佇列特別長的時候,會有很大的效能瓶頸。於是新的優化出現了,以下是編譯器beam_receive.erl裡面的解釋,寫的很清楚:

%%%                                                                                                                                                                    
%%% In code such as:                                                                                                                                                   
%%%                                                                                                                                                                    
%%%    Ref = make_ref(),        %Or erlang:monitor(process, Pid)                                                                                                       
%%%      .                                                                                                                                                             
%%%      .                                                                                                                                                             
%%%      .                                                                                                                                                             
%%%    receive                                                                                                                                                         
%%%       {Ref,Reply} -> Reply                                                                                                                                         
%%%    end.                                                                                                                                                            
%%%                                                                                                                                                                    
%%% we know that none of the messages that exist in the message queue                                                                                                  
%%% before the call to make_ref/0 can be matched out in the receive                                                                                                    
%%% statement. Therefore we can avoid going through the entire message                                                                                                 
%%% queue if we introduce two new instructions (here written as                                                                                                        
%%% BIFs in pseudo-Erlang):                                                                                                                                            
%%%                                                                                                                                                                    
%%%    recv_mark(SomeUniqInteger),                                                                                                                                     
%%%    Ref = make_ref(),                                                                                                                                               
%%%      .                                                                                                                                                             
%%%      .                                                                                                                                                             
%%%      .                                                                                                                                                             
%%%    recv_set(SomeUniqInteger),                                                                                                                                      
%%%    receive                                                                                                                                                         
%%%       {Ref,Reply} -> Reply                                                                                                                                         
%%%    end.                                                                                                                                                            
%%%                                                                                                                                                                    
%%% The recv_mark/1 instruction will save the current position and                                                                                                     
%%% SomeUniqInteger in the process context. The recv_set                                                                                                               
%%% instruction will verify that SomeUniqInteger is still stored                                                                                                       
%%% in the process context. If it is, it will set the current pointer                                                                                                  
%%% for the message queue (the next message to be read out) to the                                                                                                     
%%% position that was saved by recv_mark/1.                                                                                                                            
%%%    
%%% The remove_message instruction must be modified toinvalidate                                                                                                      
%%% the information stored by the previous recv_mark/1, in case there                                                                                                  
%%% is another receive executed between the calls to recv_mark/1 and                                                                                                   
%%% recv_set/1.                                                                                                                                                        
%%%                                                                                                                                                                    
%%% We use a reference to a label (i.e. a position in the loaded code)                                                                                                 
%%% as the SomeUniqInteger.                                                                                                                                            
%%%                                                   

結論: 點滴優化成就高效能。

Post Footer automatically generated by wp-posturl plugin for wordpress.

相關推薦

系統技術業餘研究 » R14A新增指令優化Ref訊息接收

Erlang的慣用法之一就是在訊息匹配的時候,如果需要唯一性,通常會通過make_ref搞個唯一的Ref來作為訊息的一部分來匹配。這個慣用法用在gen_server:call或者demonitor這樣的使用頻度很高的函式裡面。由於erlang的訊息匹配是再訊息佇列裡面挨個遍歷來匹配,特別是訊息佇列

系統技術業餘研究 » Erlang R17特性淺評

Erlang R17RC2 原始碼已經就緒, 參見 這裡 後續版本的釋出時間,官方的時間安排參見 這裡,摘抄如下: Preliminary dates for the upcoming release: Release: erts, emu,comp |Code stop

系統技術業餘研究 » Linux下系統呼叫sync_file_range

我們在做資料庫程式或者IO密集型的程式的時候,通常在更新的時候,比如說資料庫程式,希望更新有一定的安全性,我們會在更新操作結束的時候呼叫fsync或者fdatasync來flush資料到持久裝置去。而且通常是以頁面為單位,16K一次或者4K一次。 安全性保證了,但是效能就有很大的損害。而且我們更新

系統技術業餘研究 » Erlang R14B 增加引數 +swt 控制排程器的喚醒閥值

來自github上的otp原始碼提交訊息: Erlang R14B 新增加引數 +swt very_low|low|medium|high|very_high Set scheduler wakeup threshold. Default is medium The threshold dete

系統技術業餘研究 » R14A實現了EEP31,添加了binary模組

Erlang的binary資料結構非常強大,而且偏向底層,在作網路程式的時候,很方便的能夠和二進位制協議對應起來。但是由於這個資料結構加入erlang語言的時間不是很長,相關的配套模組不是很多。 在binary的匹配,替換,修改就顯的非常麻煩。 於是有了EEP31 。 R14A昨天已經實現了這個功

系統技術業餘研究 » gen_tcp呼叫程序收到{empty_out_q, Port}訊息奇怪行為分析

今天有同學在gmail裡面問了一個Erlang的問題,問題描述的非常好, 如下: 問題的背景是: 1、我開發了一個服務端程式,接收客戶端的連線。同一時刻會有多個客戶端來連線,連線後,接收客戶端請求後,再發送響應訊息,然後客戶端主動斷連。

系統技術業餘研究 » Erlang新增選項 +zerts_de_busy_limit 控制節點間通訊的資料量

erlang節點間通訊預設是通過tcp通道進行的, 而且每對節點間只有一個tcp連結,所有的rpc和內建的類似monitor這樣的訊息也都是通過這個通道進行的. 當資料量過大的時候, 系統就會發出 busy distribution port警告, 同時限制資料的吞吐. 這個值預設是128k. 現

系統技術業餘研究 » Flashcache新增驅逐空閒髒頁引數

我在之前的博文提過Flashcache的cache是以set為單位管理的,每個set預設2M。 當單個set裡面的髒頁數量超過dirty_thresh_pct的時候,就會啟動背景工作佇列來把超過設定的髒頁回寫到後備磁碟去。 這裡有別的同學對flashcache設計文件的翻譯. 參看dirty_th

系統技術業餘研究 » 的工作和研究方向

和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w

系統技術業餘研究 » OTP R14A今天正式釋出了

點選這裡下載R14A 以下是這次釋出的亮點,沒有太大的效能改進, 主要是修理了很多BUG! — HIGHLIGHTS ———————————————————- OTP-8217 == erts stdlib compiler == The module binary from EEP31 (an

系統技術業餘研究 » ETS的壓縮特性

即將釋出的R14B01要支援ets的壓縮,更大程度的提高記憶體的利用率。 在github上可以看到這個分支,有興趣的同學可以下載下來看看。 壓縮的時候只壓縮value, key是不壓縮的。 value特別簡單型別的eterm也是不壓縮的,因為zip壓縮需要一定長度的內容,而且壓縮本身也要加入一點的

系統技術業餘研究 » 如何找出異常所在的行(思路)

在Erlang-china的郵件列表上看到這樣的問題: 我的服務經常發生這樣的錯誤,舉例: Error in process <0.33.0> with exit value: {badarg,[{erlang,’++’,[undefined,[{“37”}]]},{groups,do

系統技術業餘研究 » Erlang叢集自動化新增節點指南

Erlang的叢集是由各個節點組成的,一個節點有一個名字來標識,而不管這個節點在網路的物理位置,所以在部署Erlang叢集的時候就很方便。只要在叢集裡新啟動一個節點,給個相對固定的引導的節點,讓新節點和這個引導節點取得聯絡,由引導節點把新節點介紹入叢集就OK了。 在實踐中,新採購的機器上通常配置好

系統技術業餘研究 » trace機制新增exception_trace

我們在使用Erlang的時候,經常會發現exception被靜悄悄得忽略掉了,這點對於診斷問題非常的不友好。R14B04新新增exception_trace幫助使用者在異常的時候,得到異常得呼叫棧,就馬上可以解決問題。 這個功能主要面對高階使用者,文件裡面沒怎麼描述這個事情,主要的實現在erts的

系統技術業餘研究 » fio效能測試工具添圖形前端gfio

gfio.c: In function ‘gfio_ui_setup_log’: gfio.c:322: error: ‘GtkTreeSelection’ undeclared (first use in this function) gfio.c:322: error: ‘selection

系統技術業餘研究

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » MySQL資料庫架構的演化觀察

MySQL資料庫架構的演化觀察 December 14th, 2017 Categories: 資料庫 Tags: mysql

系統技術業餘研究 » inet_dist_connect_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 推薦工作機會

最後更新時間:2014/11/28 請賜簡歷至:[email protected], 感謝您對加入我們公司有興趣,我們希望能早日和您共事。 以下幾個職位1年內有效,歡迎內部轉崗:
 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海

系統技術業餘研究 » 叢集引入inet_dist_{listen,connect}_options更精細引數微調

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke