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

Zurück zum Archiv-Index

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




tDiary-users-talk メーリングリストの案内
Zurück zum Archiv-Index