[tDiary-users-talk: 0502] [patch] eliminate calling 'instance_eval()'

Back to archive index

Makoto Kuwata kwa****@kuwat*****
2012年 1月 15日 (日) 12:33:47 JST


桑田です。
tDiaryでは、いたるところで eval や instance_eval がつかわれてますが、
これを多少なりとも少なくするパッチを書きました。
自分が調べた限りでは、1回のリクエストにつき instance_eval() の
呼び出し回数を 43 回減らせました。
ただし、ベンチマークしたかぎりではアプリケーション全体のパフォーマンスは
ほとんど変わらなかったので、興味なければ無視していただいて結構です。

------------------------------------------------------------
diff --git a/tdiary/config.rb b/tdiary/config.rb
index 6a1ca95..adc0c0d 100644
--- a/tdiary/config.rb
+++ b/tdiary/config.rb
@@ -246,18 +246,16 @@ module TDiary

 		private
 		def setup_attr_accessor_to_all_ivars
-			instance_variables.each do |ivar_sym|
+			s = ''
+			instance_variables().each do |ivar_sym|
 				v = ivar_sym.to_s.sub( /@/, '' )
-				instance_eval( <<-SRC
-					def #{v}
-						@#{v}
-					end
-					def #{v}=(p)
-						@#{v} = p
-					end
-					SRC
-				)
+				s << "def #{v}; @#{v}; end\n"
+				s << "def #{v}=(p); @#{v}=p; end\n"
 			end
+			instance_eval(s)
+			## or
+			#names = instance_variables().collect {|ivar| ivar.to_s.sub(/@/, '') }
+			#(class << self; self; end).class_eval { attr_accessor *names }
 		end

 		def configure_bot_pattern
------------------------------------------------------------


以上です。

--
makoto kuwata




tDiary-users-talk メーリングリストの案内
Back to archive index