mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
rein in GC during tests by making them run (at most) once per second
this can provide a significant performance boost during testing, by preventing the GC from running too frequently.
This commit is contained in:
parent
79a06225ef
commit
16a23a184e
2 changed files with 28 additions and 4 deletions
|
@ -3,6 +3,9 @@ module ActiveSupport
|
||||||
module GarbageCollection
|
module GarbageCollection
|
||||||
def self.included(base)
|
def self.included(base)
|
||||||
base.teardown :scrub_leftover_instance_variables
|
base.teardown :scrub_leftover_instance_variables
|
||||||
|
|
||||||
|
base.setup :begin_gc_deferment
|
||||||
|
base.teardown :reconsider_gc_deferment
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -14,6 +17,27 @@ module ActiveSupport
|
||||||
remove_instance_variable(var)
|
remove_instance_variable(var)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Minimum interval, in seconds, at which to run GC. Might be less
|
||||||
|
# frequently than this, if a single test takes longer than this to
|
||||||
|
# run.
|
||||||
|
DEFERRED_GC_THRESHOLD = (ENV['DEFERRED_GC_THRESHOLD'] || 1.0).to_f
|
||||||
|
|
||||||
|
@@last_gc_run = Time.now
|
||||||
|
|
||||||
|
def begin_gc_deferment
|
||||||
|
GC.disable if DEFERRED_GC_THRESHOLD > 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def reconsider_gc_deferment
|
||||||
|
if DEFERRED_GC_THRESHOLD > 0 && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
|
||||||
|
GC.enable
|
||||||
|
GC.start
|
||||||
|
GC.disable
|
||||||
|
|
||||||
|
@@last_gc_run = Time.now
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -135,9 +135,9 @@ class SetupAndTeardownTest < ActiveSupport::TestCase
|
||||||
teardown :foo, :sentinel, :foo
|
teardown :foo, :sentinel, :foo
|
||||||
|
|
||||||
def test_inherited_setup_callbacks
|
def test_inherited_setup_callbacks
|
||||||
assert_equal [:reset_callback_record, :foo], self.class._setup_callbacks.map(&:raw_filter)
|
assert_equal [:begin_gc_deferment, :reset_callback_record, :foo], self.class._setup_callbacks.map(&:raw_filter)
|
||||||
assert_equal [:foo], @called_back
|
assert_equal [:foo], @called_back
|
||||||
assert_equal [:scrub_leftover_instance_variables, :foo, :sentinel, :foo], self.class._teardown_callbacks.map(&:raw_filter)
|
assert_equal [:scrub_leftover_instance_variables, :reconsider_gc_deferment, :foo, :sentinel, :foo], self.class._teardown_callbacks.map(&:raw_filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
|
@ -167,9 +167,9 @@ class SubclassSetupAndTeardownTest < SetupAndTeardownTest
|
||||||
teardown :bar
|
teardown :bar
|
||||||
|
|
||||||
def test_inherited_setup_callbacks
|
def test_inherited_setup_callbacks
|
||||||
assert_equal [:reset_callback_record, :foo, :bar], self.class._setup_callbacks.map(&:raw_filter)
|
assert_equal [:begin_gc_deferment, :reset_callback_record, :foo, :bar], self.class._setup_callbacks.map(&:raw_filter)
|
||||||
assert_equal [:foo, :bar], @called_back
|
assert_equal [:foo, :bar], @called_back
|
||||||
assert_equal [:scrub_leftover_instance_variables, :foo, :sentinel, :foo, :bar], self.class._teardown_callbacks.map(&:raw_filter)
|
assert_equal [:scrub_leftover_instance_variables, :reconsider_gc_deferment, :foo, :sentinel, :foo, :bar], self.class._teardown_callbacks.map(&:raw_filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
Loading…
Reference in a new issue