Improve performance of backtrace filtering
Reported by James Mead | March 17th, 2010 @ 07:11 PM
Nikolai Weibull posted the following to the Mocha mailing list :-
Mocha::BacktraceFilter
creates a new
Regexp
object for every line of every backtrace it
filters. It also calls File.expand_path
for each such
line.
The Regexp
object creation can easily be removed by
creating it once in #initialize
.
File.expand_path
might be more difficult to get rid
of, but File.expand_path
is slow, at least on Windows.
Getting rid of all those calls to it would thus save a lot of time.
Rewriting BacktraceFilter
to that below makes running
my 108 tests with Expectations run in less than a third of the
time:
def initialize(lib_directory = LIB_DIRECTORY)
@lib_directory = Regexp.new('^' + Regexp.escape(lib_directory))
end
def filtered(backtrace)
backtrace.reject { |location| @lib_directory.match(location) }
end
I realize that this doesn’t filter backtraces correctly if
Mocha’s paths are relative. I was, however, hoping that
someone with more knowledge in this area would be able to resolve
this. Perhaps setting LIB_DIRECTORY =
File.dirname(File.dirname(__FILE__)) + File::SEPARATOR
is a
good way of doing it? Then both @lib_directory
and
location
will both be relative or absolute, depending
on how Mocha was required.
Comments and changes to this ticket
-
James Mead November 26th, 2010 @ 11:41 AM
- State changed from new to open
@nikolai: Apologies for the (very) slow response. I've just been looking at this and thinking about it a bit. I've made the change so that the
Regexp
instance is now only created once in theBacktraceFilter#initialize
method.However, I've also realized that (a) this probably won't improve performance because a new
BacktraceFilter
instance is created for every expectation error; and (b) in any case, any performance improvement will only be apparent for people who have a lot of test failing with expectation errors. This latter case seems like a bit of an edge case, so I'm not going to make the other changes.I'm closing this ticket. Thanks, James.
-
James Mead November 26th, 2010 @ 11:41 AM
- State changed from open to resolved
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile ยป
A mocking & stubbing library for Ruby.
* <a href="http://github.com/floehopper/mocha">GitHub repository</a>
* <a href="http://mocha.rubyforge.org">Documentation</a>
* <a href="http://groups.google.com/group/mocha-developer">Mailing List</a>