Rails源代码分析(12):ActionController::Benchmarking

  • 1 什么是Benchmarking
    这个问题其实挺有含量的,这个可是一门学问,包含一套企业经营管理的思路。
    简单来说就是将各个活动进行定量化分析,从中找到自身的不足和优势的方法。
    我抄了一段:

    基准化分析法(benchmarking)就是将本企业各项活动与从事该项活动最佳者进行比较,从而提出行动方法,以弥补自身的不足。benchmarking是将本企业经营的各方面状况和环节与竞争对手或行业内外一流的企业进行对照分析的过程,是一种评价自身企业和研究其他组织的手段,是将外部企业的持久业绩作为自身企业的内部发展目标并将外界的最佳做法移植到本企业的经营环节中去的一种方法。实施benchmarking的公司必须不断对竞争对手或一流企业的产品、服务、经营业绩等进行评价来发现优势和不足。

总的来说,基准化分析法(Benchmarking)就是对企业所有能衡量的东西给出一个参考值,benchmarking可以是一种管理体系、学习过程,它更着重于流程的研究分析。

    菲利普·科特勒解释说:“一个普通的公司和世界级的公司相比,在质量、速度和成本绩效上的差距高达10倍之多。benchmarking是寻找在公司执行任务时如何比其他公司更出色的一门艺术。”其实中国古代战略名著孙子兵法也有提到“知己知彼,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必败”。其实这是很简单的道理。

Benchmarking法起源于Xerox公司,施乐曾是影印机的代名词,但日本公司在第二次世界大战以后,勤奋不懈地努力,在诸多方面模仿美国企业的管理、营销等操作方法。日本竞争者介入瓜分市场,从1976年到1982年之间,占有率从80%降至13%。施乐于1979年在美国率先执行benchmarking,总裁柯恩斯1982年赴日学习竞争对手,买进日本的复印机,并通过“逆向工程”,从外向内分析其零部件,并学习日本企业以TQC推动全面品管,从而在复印机上重新获得竞争优势。 

   

    而在Rails里面,定义为:times the performance of actions and reports to the logger 就是记录action执行时间,并记录到日志。这个是作为分析Rails方法运行效率的一个重要依据。


  • 2 Benchmarking如何运行
    主要衡量的两个指标是:数据库运行时间,渲染(render)的时间,以及其他程序运行时间。
    因为perform_action执行包括了render方法,那么如何进行计量呢?
  1.     def self.included(base)
  2.       base.extend(ClassMethods)
  3.       base.class_eval do
  4.         alias_method_chain :perform_action:benchmark
  5.         alias_method_chain :render:benchmark
  6.       end
  7.     end
    这段代码可以看到,将benchmark和perform_action以及render方法分别进行绑定。

    
    
  1.       def render_with_benchmark(options = nil, extra_options = {}, &block)
  2.         unless logger
  3.           render_without_benchmark(options, extra_options, &block)
  4.         else
  5.           db_runtime = ActiveRecord::Base.connection.reset_runtime if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? # 1 render开始前 的数据库时间 
  6.           render_output = nil
  7.           @rendering_runtime = Benchmark::realtime{ render_output = render_without_benchmark(options, extra_options, &block) } #计算执行rendering总共所需要的总时间
  8.           if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
  9.             @db_rt_before_render = db_runtime
  10.             @db_rt_after_render = ActiveRecord::Base.connection.reset_runtime # 2 render结束后数据库运行时间
  11.             @rendering_runtime -= @db_rt_after_render #render时间就是总时间减去数据库执行时间
  12.           end
  13.           render_output
  14.         end
  15.       end 
         
  1.       def perform_action_with_benchmark
  2.         unless logger
  3.           perform_action_without_benchmark
  4.         else
  5.           runtime = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max #先执行perform_action方法,至少假定为0.0001秒
  6.           log_message  = "Completed in #{sprintf("%.5f", runtime)} (#{(1 / runtime).floor} reqs/sec)"
  7.           log_message << rendering_runtime(runtime) if defined?(@rendering_runtime)
  8.           log_message << active_record_runtime(runtime) if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
  9.           log_message << " | #{headers["Status"]}"
  10.           log_message << " [#{complete_request_uri rescue "unknown"}]"
  11.           logger.info(log_message)
  12.           response.headers["X-Runtime"] = sprintf("%.5f", runtime)
  13.         end
  14.       end
  1.       def rendering_runtime(runtime)
  2.         percentage = @rendering_runtime * 100 / runtime
  3.         " | Rendering: %.5f (%d%%)" % [@rendering_runtime, percentage.to_i]
  4.       end
  5.       def active_record_runtime(runtime)
  6.         db_runtime    = ActiveRecord::Base.connection.reset_runtime # 3 其他的数据库时间 就是在send(controller_action_name)方法中执行的数据库操作
  7.         db_runtime    += @db_rt_before_render if @db_rt_before_render # 加上 前面1 提到的
  8.         db_runtime    += @db_rt_after_render if @db_rt_after_render # 加上 前面2 提到的
  9.         db_percentage = db_runtime * 100 / runtime
  10.         " | DB: %.5f (%d%%)" % [db_runtime, db_percentage.to_i]
  11.       end





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值