public
Fork of defunkt/cache_fu
Description: Everyone's favorite memcached plugin for ActiveRecord.
Homepage: http://errtheblog.com
Clone URL: git://github.com/technoweenie/cache_fu.git
defunkt (author)
Tue Jan 22 16:27:07 -0800 2008
cache_fu / lib / acts_as_cached / benchmarking.rb
100644 74 lines (59 sloc) 2.072 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
require 'benchmark'
 
module ActsAsCached
  module Benchmarking #:nodoc:
    def self.cache_runtime
      @@cache_runtime ||= 0.0
    end
 
    def self.cache_reset_runtime
      @@cache_runtime = nil
    end
 
    def cache_benchmark(title, log_level = Logger::DEBUG, use_silence = true)
      return yield unless logger && logger.level == log_level
      result = nil
 
      seconds = Benchmark.realtime {
        result = use_silence ? ActionController::Base.silence { yield } : yield
      }
 
      @@cache_runtime ||= 0.0
      @@cache_runtime += seconds
 
      logger.add(log_level, "==> #{title} (#{'%.5f' % seconds})")
      result
    end
 
    def fetch_cache_with_benchmarking(*args)
      cache_benchmark "Got #{cache_key args.first} from cache." do
        fetch_cache_without_benchmarking(*args)
      end
    end
 
    def set_cache_with_benchmarking(*args)
      cache_benchmark "Set #{cache_key args.first} to cache." do
        set_cache_without_benchmarking(*args)
      end
    end
 
    def expire_cache_with_benchmarking(*args)
      cache_benchmark "Deleted #{cache_key args.first} from cache." do
        expire_cache_without_benchmarking(*args)
      end
    end
 
    def self.add_to(klass)
      return if klass.respond_to? :fetch_cache_with_benchmarking
      klass.extend self
 
      class << klass
        alias_method_chain :fetch_cache, :benchmarking
        alias_method_chain :set_cache, :benchmarking
        alias_method_chain :expire_cache, :benchmarking
 
        def logger; RAILS_DEFAULT_LOGGER end unless respond_to? :logger
      end
    end
 
    def self.inject_into_logs!
      ActionController::Base.send :alias_method_chain, :rendering_runtime, :memcache
    end
  end
end
 
module ActionController
  class Base
    def rendering_runtime_with_memcache(runtime) #:nodoc:
      cache_runtime = ActsAsCached::Benchmarking.cache_runtime
      ActsAsCached::Benchmarking.cache_reset_runtime
      rendering_runtime_without_memcache(runtime) + (cache_runtime.nonzero? ? " | Memcache: #{"%.5f" % cache_runtime}" : '')
    end
  end
end