Closed Bug 66381 Opened 24 years ago Closed 17 years ago

JS_MaybeGC should optimize garbage-collected/time-in-GC

Categories

(Core :: JavaScript Engine, defect, P2)

defect

Tracking

()

RESOLVED WONTFIX
mozilla1.1beta

People

(Reporter: brendan, Unassigned)

References

Details

(Keywords: helpwanted, js1.5, perf)

Attachments

(2 files, 3 obsolete files)

which involves not running too often (to amortize constant costs in GC'ing) and measuring garbage creation rate, filtering it to smooth the GC schedule, and matching garbage collection rate. /be
Will try for mozilla0.8. /be
Status: NEW → ASSIGNED
Keywords: js1.5, mozilla0.8
Target Milestone: --- → mozilla0.8
Moving out, but I will get to this in 0.9 timeframe. /be
Keywords: mozilla0.8mozilla1.0
Target Milestone: mozilla0.8 → mozilla0.9
Priority: -- → P2
Shaver, you wanna take this one? /be
Target Milestone: mozilla0.9 → mozilla0.9.1
shaver wants this, I know it! /be
Assignee: brendan → shaver
Status: ASSIGNED → NEW
Incremental GC, which I think we agree is the right solution to this problem, isn't going to happen for mozilla0.9.1. I'll try to get it working during my period of unemployment, and post progress here. Expect an onslaught of dependent bugs covering interim changes to the GC flags and object locking mechanisms.
Status: NEW → ASSIGNED
Target Milestone: mozilla0.9.1 → mozilla0.9.2
Asa just told me that we shipped 0.9.2! Who knew?
Target Milestone: mozilla0.9.2 → mozilla0.9.3
Target Milestone: mozilla0.9.3 → mozilla0.9.4
->0.9.5 since we have run out of time
Target Milestone: mozilla0.9.4 → mozilla0.9.5
I don't really know when I will get this done, so I'm removing the lying milestone marker.
Keywords: helpwanted
Target Milestone: mozilla0.9.5 → ---
cc:ing myself From links to it in other bugs (such as 104127) it sounds like some smart people think this could be important to fix for performance. Hopefully it'll at least make moz 1.0?
Any GC work going to happen for 0.9.9 or 1.0?
shaver's on a road trip, hacking incremental gc! /be
This is not a finished work, but it lets me run all my new GC test cases and the last version of this was happy enough in the browser. I'm going to spin a new build today with this latest stuff, and some other cleanups, and see how it holds up. People who have seen the GC show up in profiles unpleasantly might want to take their lives in their hands and try a profile or two with this patch. The real money (incremental GC) is still a little ways off, but I think the iterative marking might be a useful win anyway. Post here with results!
Keywords: perf
You probably don't want to use this in software that controls medical equipment, or even your television, but it _should_ actually work in the browser and other apps that don't need GC_MARK_DEBUG. Oh, and I haven't tested it with JS_THREADSAFE at all (might not even compile!). But I'll be damned if I'm not going to back this up everywhere I can, and bugzilla's handy.
Attachment #66003 - Attachment is obsolete: true
On WinNT, trying to test the patch above (id=67618). Here's what's happening: METHOD 1 1. Pull from the tip 2. Apply the patch 3. Compile 4. Run the testsuite 5. RESULT: approx 25 regressions due to the patch; not good. METHOD 2 1. For each file not in the patch, pull from the tip 2. For each file in the patch, pull the version mentioned there (for example, do cvs up -r3.42 jslock.c) 3. Apply the patch 4. Compile 5. RESULT: can't compile: cl -FoWINNT4.0_DBG.OBJ/ -c /MD /Od /Z7 -DXP_PC -DWIN32 -D_WINDOWS -D_WIN32 /nologo /W3 /FpWINNT4.0_DBG.OBJ/js.pch -DDEBUG -DDEBUG_ -DEXPORT_JS_API jsstr.c jsstr.c jsstr.c(2677) : error C2143: syntax error : missing ')' before '(' jsstr.c(2677) : error C2091: function returns function jsstr.c(2677) : error C2373: 'memcpy' : redefinition; different type modifiers C:\PROGRA~1\MICROS~2\VC98\INCLUDE\string.h(101) : see declaration of 'memcpy' jsstr.c(2677) : error C2059: syntax error : 'type' make[1]: *** [WINNT4.0_DBG.OBJ/jsstr.obj] Error 2 make: *** [all] Error 2 I tried hard to verify that the actual differences I have in my js/src correspond exactly to the diffs in the patch, and they seem to. I don't know whether either Method 1 or Method 2 is viable. The problem is, either way I'm not sure my JS src matches Mike's. Mike: would it be possible to provide another patch against the current tip? If that wouldn't be too much trouble, then I could try again...
Well, that sucks. I'm not surprised it's not clean against the trunk, but I am surprised that I'm botching the tests now. I'll take a copy of the test suite to the cottage this weekend. I had some version of this (and I thought it was the attached version) running in the browser for a while, so there's something funky going on here. Sorry about that, all.
Here's the command line I use to run the tests: [//d/JS_TRUNK/mozilla/js/tests] perl jsDriver.pl -e smdebug smopt -k -L lc2 lc3
So, with that test setup, I get 7 failures without my patch, and 6 failures with. (Freaky ones: Math.random, String.prototype.replace, etc.) I'll attach another patch before I hit the cottage, updated to the tip.
I can pass the test suite now, kinda, and I'm spinning a Mozilla build that I can do more testing with as I type this. I get only 7 test failures for smdebug, and they're not all the same as phil's: ecma_3/Function/regress-104584.js ecma_3/RegExp/15.10.4.1-5-n.js ecma_3/RegExp/regress-123437.js ecma_3/String/regress-83293.js js1_5/Array/regress-101964.js js1_5/Exceptions/regress-123002.js js1_5/Object/regress-90596-003.js Of course, I passed the test suite earlier with a jsshell that would crash horribly the second it got into GC, so I'm waiting for my Mozilla build to complete before I get excited.
Attachment #67618 - Attachment is obsolete: true
Don't touch that last patch (#69316). It'll stop you cold, on startup, because of a left-over assertion in the tree I diffed to make the patch. With the patch I'm attaching now, the browser is happy, and so am I. Now I just(!) need to finish the write barrier, and we're in business for 0.9.9. Who can run Ts/Tp/Txul numbers on this for me? I think we should see some light speedup, but I'm mostly interested in validating my assertion that we don't get _hurt_ by this.
Attachment #69316 - Attachment is obsolete: true
I'm seeing a slight Ts win and a 1.5% Txul loss from that latest patch (even once I get rid of the last js_LockGCThing calls in the startup path), but jrgm is reporting huge memory consumption and other incredibly bad things when he tries to generate Tp numbers. More, uh, later today. Happy Valentine's Day!
OS type: Linux attica 2.2.12-20smp #1 SMP Mon Sep 27 10:34:45 EDT 1999 i686 gcc version 2.95.3 20010315 (release) Mike's latest patch (69337) passes JS testsuite for me in optimized JS shell. The only failures are the current known bugs: Retest List, smopt # 1020 of 1020 test(s) were completed, 9 failures reported. ecma_3/ExecutionContexts/10.1.3-2.js <-- new test of duplicate function params ecma_3/RegExp/regress-85721.js <-- new RegExp performance test ecma_3/RegExp/regress-103087.js ecma_3/RegExp/regress-119909.js ecma_3/RegExp/regress-123437.js js1_5/Object/regress-90596-001.js js1_5/Object/regress-90596-002.js js1_5/Object/regress-90596-003.js js1_5/Array/regress-101964.js HOWEVER, in the debug JS shell, I am getting many crashes on testcases that seem to deal with numeric data. # Retest List, smdebug # 1020 of 1020 test(s) were completed, 31 failures reported. ecma/Expressions/11.10-1.js ecma/Expressions/11.10-2.js ecma/Expressions/11.10-3.js ecma/Expressions/11.4.8.js ecma/Expressions/11.7.1.js ecma/Expressions/11.7.2.js ecma/Expressions/11.7.3.js ecma/GlobalObject/15.1.2.5-3.js ecma/String/15.5.4.4-1.js ecma/String/15.5.4.7-1.js ecma/String/15.5.4.7-2.js ecma/String/15.5.4.8-2.js ecma_2/String/split-002.js ecma_2/String/split-003.js ecma_3/ExecutionContexts/10.1.3-2.js ecma_3/RegExp/regress-103087.js ecma_3/RegExp/regress-119909.js ecma_3/RegExp/regress-123437.js js1_2/String/slice.js js1_2/regexp/alphanumeric.js js1_2/regexp/digit.js js1_2/regexp/whitespace.js js1_2/regexp/word_boundary.js js1_4/Regress/function-002.js js1_5/Regress/regress-89443.js js1_5/Regress/regress-111557.js js1_5/Object/regress-90596-001.js js1_5/Object/regress-90596-002.js js1_5/Object/regress-90596-003.js js1_5/Array/regress-101964.js js1_5/Array/regress-107138.js
The risk/reward for 1.0 doesn't feel right, shamed though I am to still have not solved this. I'll attach patches as I background-hack on this, but 1.1 is the earliest I'm looking to put this on the trunk. I'll cut a branch for this, for easy testing by the brave and willing.
Target Milestone: --- → mozilla1.1
Keywords: patch
Blocks: 149801
Keywords: mozilla1.0mozilla1.1
Target Milestone: mozilla1.1alpha → mozilla1.1beta
Blocks: 156155
No longer blocks: 149801
Blocks: 71306
No longer blocks: 71306
I'm off to resurrect the non-recursive marking part of this patch
Depends on: 76831
Blocks: 76831
No longer depends on: 76831
Please, bug 76831 is not a meta-bug, is way too broad a bug, and is not obviously blocked by this bug. Even if this bug is fixed, a swapped-out mozilla process is likely to take a long time to page back in. /be
No longer blocks: 76831
Mass abdication.
Assignee: shaver → nobody
Status: ASSIGNED → NEW
QA Contact: pschwartau → general
Old bugs never die, they go to live in bugzilla. WONTFIXing this unless someone objects.
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → WONTFIX
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: