成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讓Ruby性能增加30%的改進方法分析

開發 開發工具
我們都知道在編譯Ruby的時候你需要使用configure的 --disable-pthread參數,而在configure --disable-pthread 可以讓你得到大約 30% 性能提高。本文將分析這些性能的提高原因并給出更好的建議。

我們都知道在編譯Ruby的時候你需要使用configure的 --disable-pthread參數。沒錯,在configure --disable-pthread 可以讓你得到大約 30% 性能提高。但是,這是為什么呢?

所有的這一些我們需要使用 strace 工具,這個工具可以打出所有的真實的操作系統的調用。

下面,是一段我們測試的例程:

def make_thread
  Thread.new {
    a = []
    10_000_000.times {
      a << "a"
      a.pop
    }
  }
end

t = make_thread
t1 = make_thread

t.join
t1.join

如果我們使用 strace 工具去測試 configure --enable-pthread 版本的Ruby引擎,那么我們可以得到下面這樣的結果:

22:46:16.706136 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>
22:46:16.706177 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>
22:46:16.706218 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>
22:46:16.706259 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000005>
22:46:16.706301 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>
22:46:16.706342 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>
22:46:16.706383 rt_sigprocmask(SIG_BLOCK, NULL, [], 8 ) = 0 <0.000004>

你會發現上面的sigprocmask 系統調用一頁一頁又一頁地沒完沒了的。如果你用 strace -c,你會發現一共大約20,054,180 個sigprocmask系統調用。但是,如果你是在--disable-pthread 的Ruby版本下運行,你會發現根本沒有那么多的sigprocmask 系統調用(只有 3 次,簡直就是天壤之別)

查看一下源代碼

我們知道 configure 是一個腳本,其主要用來創建一個 config.h 文件,其中有一大堆宏定義 defines ,這些宏定義決定了使用什么樣的函數。所以,讓我們來比較一下版本 ./configure --enable-pthread 和版本./configure --disable-pthread的不同之處吧。

$ diff config.h config.h.pthread
> #define _REENTRANT 1
> #define _THREAD_SAFE 1
> #define HAVE_LIBPTHREAD 1
> #define HAVE_NANOSLEEP 1
> #define HAVE_GETCONTEXT 1
> #define HAVE_SETCONTEXT 1

好的,現在我們再 grep 一下Ruby的源代碼,我們可以看到只要HAVE_[S/G]ETCONTEXT 被設置了,Ruby 就會調用setcontext() 和getcontext() 這兩個系統調用來存取context 的狀態,以便異常處理時的切換(通過EXEC_TAG)。

而如果 HAVE_[S/G]ETCONTEXT 沒有被定義 的情況下,Ruby 會使用 _setjmp/_longjmp這兩個系統調用。

我們來看看 _setjmp/_longjmp 的man page:

… The _longjmp() and _setjmp() functions shall be equivalent to longjmp() and setjmp(), respectively, 
with the additional restriction that _longjmp() and _setjmp() shall not manipulate the signal mask…

還有setcontext /getcontext的 man page:

… uc_sigmask is the set of signals blocked in this context (see sigprocmask(2)) …

我們可以看到 getcontext 調用每次都要調用sigprocmask 但是_setjmp 不會。

補丁

通過補丁增加了一個configure 的參數 --disable-ucontext 其可以讓你關閉使用 setcontext或getcontext,你只需要像如下方式使用就好了。

./configure --disable-ucontext --enable-pthread

補丁下載:http://github.com/ice799/matzruby/commit/0b9b69f9653782a33aee2b8937d405eae245b60c

如果你以這種方式編譯Ruby,那么,你的程序的性能在同等條件下可能會有30%左右的提升。
 

【編輯推薦】

  1. Ruby語言的發展趨勢和啟示
  2. Ruby on Rails為企業SOA做好準備了嗎
  3. 腳本語言排行榜 PHP、Ruby和Python領先
責任編輯:佚名 來源: 酷殼
相關推薦

2024-10-24 08:07:25

大語言模型LLMRAG模型

2009-12-14 15:04:32

Ruby性能特點

2012-03-21 09:31:51

ibmdw

2009-08-06 11:12:17

提高GDI編程性能

2011-04-18 09:03:36

數據庫查詢

2009-06-29 18:04:13

Tapestry5

2015-10-14 17:27:18

性能

2015-10-10 11:00:05

RubyRails性能

2010-01-27 15:17:50

2009-12-14 13:56:12

Ruby特點

2020-01-07 10:14:38

Python程序員腳本語言

2009-12-16 15:23:33

Ruby on rai

2023-02-17 12:55:39

RubyWebJava

2010-07-12 09:22:05

RubyRuby on rai

2009-12-17 14:47:21

Ruby優點

2009-12-14 18:30:59

Ruby DSL特點

2009-08-18 22:15:38

VMware快照改進方

2015-09-14 10:41:51

PHP性能分析微觀分析

2015-08-18 11:44:02

PHP性能分析宏觀分析

2013-03-26 10:10:38

服務器RubyGo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费视频二区 | 国产精品美女久久久久久久网站 | av国产精品 | 男人天堂午夜 | 日韩在线播放一区 | www.日日干 | 综合五月 | 9久9久 | 精品国产一二三区 | 国产高清视频一区 | 国产不卡视频在线 | 国产伊人精品 | 国产在线一区观看 | 亚洲精品中文字幕在线观看 | 午夜99| 国产高清视频一区二区 | 91精品国产乱码久久久 | 精品欧美激情精品一区 | 国产一区二区精品 | 日韩三区 | a在线视频 | a级黄色片在线观看 | 日韩靠逼| 欧美片网站免费 | 久久精品亚洲欧美日韩精品中文字幕 | 神马久久久久久久久久 | 在线色网| 久久亚洲一区二区三区四区 | 中文字幕不卡一区 | 国产一区二区三区久久久久久久久 | 亚洲 成人 av | 天天综合操 | 久久国产视频网站 | 夜夜艹 | 久久久国产一区二区三区 | 国产福利资源在线 | 一区二区免费在线视频 | 国产精品乱码一二三区的特点 | 91在线一区二区 | 亚洲一区二区三区高清 | 日韩成人中文字幕 |