#66 ✓resolved
James Mead

Improve performance of backtrace filtering

Reported by James Mead | 2010-03-17 19:11:23 UTC

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

  • Nikolai Weibull

    Nikolai Weibull 2010-03-22 11:03:39 UTC

    Here’s a patch that should work.

  • James Mead

    James Mead 2010-11-26 11:41:31 UTC

    • 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 the BacktraceFilter#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

    James Mead 2010-11-26 11:41:40 UTC

    • 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.

New ticket Create new ticket

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.

* GitHub repository
* Documentation
* Mailing List

People watching this ticket

Attachments

Pages