2012年1月15日

[tDiary-users-talk: 0501] Re: [patch] change to load 'rexml' lazilyfor performance

桑田です。
amazon.rb プラグインを調べたところ、REXMLだけでなく他のライブラリも
読み込みを遅延させられることがわかりました。
パッチを添付します。
なお今回は autoload ではなく require '...' unless defined?(...) を
使ってますが (timeout() のため)、もちろん autoload でもいいと思います。

------------------------------------------------------------

diff --git a/misc/plugin/amazon.rb b/misc/plugin/amazon.rb
index 47e2519..9c2d4b6 100644
--- a/misc/plugin/amazon.rb
+++ b/misc/plugin/amazon.rb
@@ -5,10 +5,10 @@
# Copyright (C) 2005-2007 TADA Tadashi <sho@xxxxx>
# You can redistribute it and/or modify it under GPL2.
#
-require 'net/http'
-require 'uri'
-require 'timeout'
-require 'rexml/document'
+#require 'net/http' # lazy load
+#require 'uri' # lazy load
+#require 'timeout' # lazy load
+#require 'rexml/document' # lazy load

# do not change these variables
@amazon_subscription_id = '1CVA98NEF1G753PFESR2'
@@ -46,6 +46,8 @@ if @conf['amazon.bitly'] and @conf['bitly.login']
and @conf['bitly.key'] then
end

def amazon_fetch( url, limit = 10 )
+ require 'net/http' unless defined?(::Net::HTTP) # lazy load
+ require 'uri' unless defined?(::URI) # lazy load
raise ArgumentError, 'HTTP redirect too deep' if limit == 0

px_host, px_port = (@conf['proxy'] || '').split( /:/ )
@@ -78,6 +80,7 @@ def amazon_call_ecs( asin, id_type, country )
url << "&Version=#{@amazon_require_version}"

begin
+ require 'timeout' unless defined?(::Timeout) # lazy load
timeout( 10 ) do
amazon_fetch( url )
end
@@ -256,6 +259,8 @@ def amazon_get( asin, with_image = true, label =
nil, pos = 'amazon' )
if @conf.secure then
amazon_secure_html( asin, with_image, label, pos, country )
else
+ require 'rexml/document' unless defined?(::REXML)
+ require 'timeout' unless defined?(::Timeout) # lazy load
begin
cache = "#{@cache_path}/amazon"
Dir::mkdir( cache ) unless File::directory?( cache )
------------------------------------------------------------

apache benchでのベンチマークです。
なお「プラグイン複数回読み込み防止パッチ」適用後の計測です。


## (Ruby 1.8.7-p334)
## before
Requests per second: 4.34 [#/sec] (mean)
## after (lazy load: rexml)
Requests per second: 4.77 [#/sec] (mean) # 10% up
## after (lazy load: rexml, net/http, uri, timeout)
Requests per second: 4.96 [#/sec] (mean) # 14% up

## (Ruby 1.9.3-p0)
## before
Requests per second: 2.33 [#/sec] (mean)
## after (lazy load: rexml) # 19% up
Requests per second: 2.77 [#/sec] (mean)
## after (lazy load: rexml, net/http, uri, timeout)
Requests per second: 2.98 [#/sec] (mean) # 28% up


このパッチにより、amazon.rb プラグインの読み込みコストはほぼなくなりますので、
amazon.rb プラグインがデフォルトで enable になっていてもパフォーマンスに
影響をあたえることはないでしょう。

読み込みコストの大きいプラグインとしては、amazon.rb のほかに disp_referrer.rb があります。
しかし読んで見たかぎりでは、コードが複雑でどう改善していいのかわかりませんでした。
これを改善できれば、CGI の性能が 10% 〜 20% 向上するでしょう。

以上です。

--
makoto kuwata

_______________________________________________
tDiary-users-talk mailing list
tDiary-users-talk@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/tdiary-users-talk


投稿者 xml-rpc : 2012年1月15日 12:19
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/108166
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。