Patchwork [2,of,7] perf: perform a garbage collection before each iteration

login
register
mail settings
Submitter Gregory Szorc
Date March 14, 2017, 5:15 a.m.
Message ID <3b997adb7efece7395fb.1489468544@ubuntu-vm-main>
Download mbox | patch
Permalink /patch/19318/
State Accepted
Headers show

Comments

Gregory Szorc - March 14, 2017, 5:15 a.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1489454202 25200
#      Mon Mar 13 18:16:42 2017 -0700
# Node ID 3b997adb7efece7395fb585a70b2d70522626648
# Parent  f6f1f5efe05f4e3737dc198284f548e31a616f4b
perf: perform a garbage collection before each iteration

Currently, no explicit garbage collection is performed when running
the microbenchmarks in `hg perf`. I think this is wrong because
garbage collection can have a significant impact on execution times.
And, if gc is triggered via the default heuristics, it will
fire effectively randomly during subsequent benchmark iterations
due to variable amount of garbage left over from previous runs.

Running a gc before invoking the measured function will help ensure
state is more consistent across all iterations.
Yuya Nishihara - March 14, 2017, 8:26 a.m.
On Mon, 13 Mar 2017 22:15:44 -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc@gmail.com>
> # Date 1489454202 25200
> #      Mon Mar 13 18:16:42 2017 -0700
> # Node ID 3b997adb7efece7395fb585a70b2d70522626648
> # Parent  f6f1f5efe05f4e3737dc198284f548e31a616f4b
> perf: perform a garbage collection before each iteration
> 
> Currently, no explicit garbage collection is performed when running
> the microbenchmarks in `hg perf`. I think this is wrong because
> garbage collection can have a significant impact on execution times.
> And, if gc is triggered via the default heuristics, it will
> fire effectively randomly during subsequent benchmark iterations
> due to variable amount of garbage left over from previous runs.
> 
> Running a gc before invoking the measured function will help ensure
> state is more consistent across all iterations.

Makes sense. Queued the first two. I'll revisit the others later.

Patch

diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -20,6 +20,7 @@ 
 
 from __future__ import absolute_import
 import functools
+import gc
 import os
 import random
 import sys
@@ -189,6 +190,7 @@  def stub_timer(fm, func, title=None):
     func()
 
 def _timer(fm, func, title=None):
+    gc.collect()
     results = []
     begin = util.timer()
     count = 0