150: def benchmark(*args)
151: msg = args.pop
152: level = args.pop
153: object = nil
154:
155: if args.empty?
156: if respond_to?(level)
157: object = self
158: else
159: object = Puppet
160: end
161: else
162: object = args.pop
163: end
164:
165: unless level
166: raise Puppet::DevError, "Failed to provide level to :benchmark"
167: end
168:
169: unless level == :none or object.respond_to? level
170: raise Puppet::DevError, "Benchmarked object does not respond to %s" % level
171: end
172:
173:
174: if level != :none and Puppet::Util::Log.sendlevel?(level)
175: result = nil
176: seconds = Benchmark.realtime {
177: yield
178: }
179: object.send(level, msg + (" in %0.2f seconds" % seconds))
180: return seconds
181: else
182: yield
183: end
184: end