Closed Bug 486321 Opened 16 years ago Closed 3 years ago

Large arrays that start out sparse/slowified waste memory if they are filled in so that they effectively become dense

Categories

(Core :: JavaScript Engine, defect)

defect
Not set
normal

Tracking

()

RESOLVED DUPLICATE of bug 835102

People

(Reporter: romaxa, Unassigned)

Details

(Whiteboard: [MemShrink:P3])

Attachments

(1 file)

Attached file Testcase
Allocation of js array with 2000000 elements takes about ~85000Kb in mozilla-jsEngine

The same array allocated in webkit r41418 ~22000Kb

Why is there so big difference?
Depends on: 491126
I have tested with latest mozilla-central, and situation the same, it is still eating ~80Mb...
Seems bug 491126 did not help.
mem monitor output

		system	process		private	/------ dirty ---------\
time:		avail:	size:	rss:	clean:	shared:	private: change:
13:41:07	118868	131980	24776	9108	0	9304	   +0 kB
13:41:08	117108	142092	26820	9348	0	11084	+1780 kB
13:41:10	113508	145536	30316	9348	0	14580	+3496 kB
13:41:11	109236	149648	34452	9348	0	18716	+4136 kB
13:41:12	106508	152488	37332	9348	0	21596	+2880 kB
13:41:14	103712	155464	40220	9348	0	24484	+2888 kB
13:41:15	99604	159936	44716	9348	0	28980	+4496 kB
13:41:16	96176	163432	48224	9348	0	32488	+3508 kB
13:41:17	93352	166536	51348	9348	0	35632	+3144 kB
13:41:19	90220	170032	54828	9336	0	39156	+3524 kB
13:41:20	88796	171928	56608	9332	0	40944	+1788 kB
13:41:21	83608	177096	61880	9332	0	46216	+5272 kB
13:41:23	81400	179656	64420	9332	0	48756	+2540 kB
13:41:24	79264	181948	66704	9368	0	51004	+2248 kB
13:41:25	79160	181948	66708	9368	0	51004	   +0 kB
13:41:27	79068	181948	66728	9368	0	51024	  +20 kB
13:41:28	77032	184100	68872	9368	0	53168	+2144 kB
13:41:29	74912	186392	71192	9368	0	55488	+2320 kB
13:41:31	72644	188680	73452	9364	0	57796	+2308 kB
13:41:32	70064	191384	76160	9360	0	60508	+2712 kB
13:41:34	67744	193812	78572	9348	0	62936	+2428 kB
13:41:35	65388	196236	80980	9340	0	65356	+2420 kB
13:41:36	63308	198528	83040	9332	0	67584	+2228 kB
13:41:38	61608	200412	84604	9284	0	69456	+1872 kB
13:41:39	60004	202024	86104	9200	0	71148	+1692 kB
13:41:41	59224	202836	86832	9148	0	71932	 +784 kB
13:41:42	42432	220700	103200	8536	0	89732	+17800 kB
13:41:43	42452	220700	102604	8104	0	89732	   +0 kB
13:41:45	50540	212504	94452	8120	0	81548	-8184 kB
13:41:46	50508	212504	94460	8120	0	81548	   +0 kB
13:41:48	49940	213048	94976	8120	0	82064	 +516 kB
13:41:49	47736	215200	97248	8120	0	84336	+2272 kB
13:41:50	45512	217492	98988	7668	0	86528	+2192 kB
13:41:52	43100	219780	99892	6492	0	88856	+2328 kB
13:41:53	41312	221936	99868	4460	0	91052	+2196 kB
13:41:55	39280	224360	101796	4356	0	93368	+2316 kB
13:41:56	37164	226516	104068	4356	0	95640	+2272 kB
13:41:57	36164	228748	105236	4472	0	96760	+1120 kB
13:41:59	37892	227464	105160	4636	0	96604	 -156 kB
13:42:00	39100	258216	110028	6656	0	99272	+2668 kB
13:42:02	39348	258216	110028	6608	0	99272	   +0 kB
The changes for the bug 491126 could not help this test case. Its essence is the following code:

var alloc = function(size) {
    var arr = new Array(size);
    arr[size-1] = 123;
    for (var i = 0; i < size; i++) {
        arr[i] = i * 2;
    }
}
...
alloc(2000*1000)

So the problem here is that due to the initial arr[size-1] = 123 and the following array[0] the array becomes slow allocating effectively JSScopeProperty (32 bytes on 32 bit platforms) per each array element in addition to the storage for the slot array. That explains the memory usage. 

The optimization from the bug 491126 that saves 12 bytes per each dense array instance cannot help here.

What could help here is a special support for sparse arrays using some kind of a tree structure or a hash table to store the elements.
No longer depends on: 491126
Still an issue with Firefox 8.0a2.
Whiteboard: [MemShrink]
OS: Linux → All
Hardware: Other → All
about:memory says this on my Linux64 build:

│  ├──180,622,424 B (41.79%) -- compartment(file:///home/njn/arraytest.html)
│  │  ├──130,199,552 B (30.12%) -- gc-heap
│  │  │  ├──128,059,392 B (29.63%) -- shapes
│  │  │  ├────1,018,328 B (00.24%) -- arena-padding
│  │  │  ├────1,017,184 B (00.24%) -- arena-headers
│  │  │  ├───────65,216 B (00.02%) -- objects
│  │  │  ├───────35,424 B (00.01%) -- arena-unused
│  │  │  ├────────3,008 B (00.00%) -- type-objects
│  │  │  └────────1,000 B (00.00%) -- scripts
│  │  ├───33,559,488 B (07.76%) -- property-tables
│  │  ├───16,787,232 B (03.88%) -- object-slots
│  │  ├───────65,536 B (00.02%) -- mjit-code
│  │  │       ├──47,152 B (00.01%) -- unused
│  │  │       └──18,384 B (00.00%) -- method
│  │  ├────────4,416 B (00.00%) -- type-inference
│  │  │        ├──3,040 B (00.00%) -- object-main
│  │  │        ├────864 B (00.00%) -- script-main
│  │  │        └────512 B (00.00%) -- tables
│  │  ├────────4,088 B (00.00%) -- analysis-temporary
│  │  ├────────1,632 B (00.00%) -- object-empty-shapes
│  │  └──────────480 B (00.00%) -- script-data

CC'ing some JS folks -- do we have existing bugs on file for this issue (where a huge array gets slowified because it's sparse to begin with, but is then filled in)?
Summary: Javascript allocate much more memory with simple array test, comparing with webkit. → Large arrays that start out sparse/slowified waste memory if they are filled in so that they effectively become dense
Whiteboard: [MemShrink] → [MemShrink:P3]
The sparse/dense array distinction was removed a while back. Things are now much better:

│   │  │  ├──19,243,792 B (08.33%) -- js-compartment(file:///home/njn/tmp/arraytest.html)
│   │  │  │  ├──19,020,256 B (08.23%) -- objects
│   │  │  │  │  ├──18,891,520 B (08.18%) -- malloc-heap
│   │  │  │  │  │  ├──16,781,312 B (07.26%) ── elements/non-asm.js
│   │  │  │  │  │  └───2,110,208 B (00.91%) ── slots
│   │  │  │  │  ├─────128,736 B (00.06%) ── gc-heap/function
│   │  │  │  │  └───────────0 B (00.00%) ── non-heap/code/asm.js
│   │  │  │  ├─────210,936 B (00.09%) -- shapes
│   │  │  │  │     ├──154,264 B (00.07%) -- gc-heap
│   │  │  │  │     │  ├───77,184 B (00.03%) ── base
│   │  │  │  │     │  ├───67,680 B (00.03%) ── tree/global-parented
│   │  │  │  │     │  └────9,400 B (00.00%) ── dict
│   │  │  │  │     └───56,672 B (00.02%) -- malloc-heap
│   │  │  │  │         ├──45,248 B (00.02%) ── compartment-tables
│   │  │  │  │         └──11,424 B (00.00%) ── tree-tables
│   │  │  │  └──────12,600 B (00.01%) -- sundries
│   │  │  │         ├───6,568 B (00.00%) ── malloc-heap
│   │  │  │         └───6,032 B (00.00%) ── gc-heap

This compares favorably with the 22000KB mentioned for Webkit in comment 0.
Assignee: general → nobody
Status: NEW → RESOLVED
Closed: 3 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: