Skip to content

[3.14] GH-139951: Fix major GC performance regression (GH-140262) - #140423

Closed
miss-islington wants to merge 1 commit into
python:3.14from
miss-islington:backport-0c01090-3.14
Closed

[3.14] GH-139951: Fix major GC performance regression (GH-140262)#140423
miss-islington wants to merge 1 commit into
python:3.14from
miss-islington:backport-0c01090-3.14

Conversation

@miss-islington

@miss-islingtonmiss-islington commented Oct 21, 2025

Copy link
Copy Markdown
Contributor
  • Count number of actually tracked objects, instead of trackable objects. This ensures that untracking tuples has the desired effect of reducing GC overhead

  • Do not track most untrackable tuples during creation. This prevents large numbers of small tuples causing execessive GCs.
    (cherry picked from commit 0c01090)

Co-authored-by: Mark Shannon mark@hotpy.org

* Count number of actually tracked objects, instead of trackable objects. This ensures that untracking tuples has the desired effect of reducing GC overhead
* Do not track most untrackable tuples during creation. This prevents large numbers of small tuples causing execessive GCs.
(cherry picked from commit 0c01090)
Co-authored-by: Mark Shannon <mark@hotpy.org>
@sergey-miryanov

sergey-miryanov commented Oct 21, 2025

Copy link
Copy Markdown
Contributor

The following change fixes free-threading tests (mainly -1386,10 +1385,6 fixes tests, other is a cleanup):

diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index db643330894..d7a4c066437 100644
--- a/Lib/test/test_gc.py+++ b/Lib/test/test_gc.py@@ -3,8 +3,7 @@
from test import support
from test.support import (verbose, refcount_test,
cpython_only, requires_subprocess,
- requires_gil_enabled,- Py_GIL_DISABLED)+ requires_gil_enabled)
from test.support.import_helper import import_module
from test.support.os_helper import temp_dir, TESTFN, unlink
from test.support.script_helper import assert_python_ok, make_script, run_test_script
@@ -1386,10 +1385,6 @@ def callback(ignored):
junk = []
i = 0
detector = GC_Detector()
- if Py_GIL_DISABLED:- # The free-threaded build doesn't have multiple generations, so- # just trigger a GC manually.- gc.collect()
assert not detector.gc_happened
while not detector.gc_happened:
i += 1
@@ -1459,10 +1454,6 @@ def __del__(self):
detector = GC_Detector()
junk = []
i = 0
- if Py_GIL_DISABLED:- # The free-threaded build doesn't have multiple generations, so- # just trigger a GC manually.- gc.collect()
while not detector.gc_happened:
i += 1
if i > 50000:

Is it fine if I add such commit to this PR? Should we apply this change to the main?

@efimov-mikhail

Copy link
Copy Markdown
Member

Сс @colesbury

@colesbury

Copy link
Copy Markdown
Contributor

The test has a @unittest.skipIf(Py_GIL_DISABLED, "requires GC generations or increments") on main, it should have the same on 3.14

@markshannon

Copy link
Copy Markdown
Member

Closing in favor of #140447

@miss-islington
miss-islington deleted the backport-0c01090-3.14 branch January 2, 2026 16:39
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@miss-islington@sergey-miryanov@efimov-mikhail@colesbury@markshannon