Makoto Kuwata
kwa****@kuwat*****
2012年 1月 15日 (日) 12:19:25 JST
桑田です。 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****@spc*****> # 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***** 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