Closed Bug 479468 Opened 15 years ago Closed 15 years ago

TM: Grow array capacity exponentially

Categories

(Core :: JavaScript Engine, defect, P3)

x86
macOS
defect

Tracking

()

RESOLVED DUPLICATE of bug 477279
mozilla1.9.1

People

(Reporter: gal, Assigned: gal)

Details

Attachments

(1 file)

      No description provided.
Allocation tracking for the following code:

js> var x = []; for (var i = 0; i < 4096; ++i) x.push(1);
nbytes=108
nbytes=8
nbytes=4
nbytes=108
nbytes=126
nbytes=12
nbytes=36
nbytes=68
nbytes=100
nbytes=132
nbytes=164
nbytes=196
nbytes=228
nbytes=260
nbytes=292
nbytes=324
nbytes=356
nbytes=388
nbytes=420
nbytes=452
nbytes=484
nbytes=516
nbytes=548
nbytes=580
nbytes=612
nbytes=644
nbytes=676
nbytes=708
nbytes=740
nbytes=772
nbytes=804
nbytes=836
nbytes=868
nbytes=900
nbytes=932
nbytes=964
nbytes=996
nbytes=1028
nbytes=1060
nbytes=1092
nbytes=1124
nbytes=1156
nbytes=1188
nbytes=1220
nbytes=1252
nbytes=1284
nbytes=1316
nbytes=1348
nbytes=1380
nbytes=1412
nbytes=1444
nbytes=1476
nbytes=1508
nbytes=1540
nbytes=1572
nbytes=1604
nbytes=1636
nbytes=1668
nbytes=1700
nbytes=1732
nbytes=1764
nbytes=1796
nbytes=1828
nbytes=1860
nbytes=1892
nbytes=1924
nbytes=1956
nbytes=1988
nbytes=2020
nbytes=2052
nbytes=2084
nbytes=2116
nbytes=2148
nbytes=2180
nbytes=2212
nbytes=2244
nbytes=2276
nbytes=2308
nbytes=2340
nbytes=2372
nbytes=2404
nbytes=2436
nbytes=2468
nbytes=2500
nbytes=2532
nbytes=2564
nbytes=2596
nbytes=2628
nbytes=2660
nbytes=2692
nbytes=2724
nbytes=2756
nbytes=2788
nbytes=2820
nbytes=2852
nbytes=2884
nbytes=2916
nbytes=2948
nbytes=2980
nbytes=3012
nbytes=3044
nbytes=3076
nbytes=3108
nbytes=3140
nbytes=3172
nbytes=3204
nbytes=3236
nbytes=3268
nbytes=3300
nbytes=3332
nbytes=3364
nbytes=3396
nbytes=3428
nbytes=3460
nbytes=3492
nbytes=3524
nbytes=3556
nbytes=3588
nbytes=3620
nbytes=3652
nbytes=3684
nbytes=3716
nbytes=3748
nbytes=3780
nbytes=3812
nbytes=3844
nbytes=3876
nbytes=3908
nbytes=3940
nbytes=3972
nbytes=4004
nbytes=4036
nbytes=4068
nbytes=4100
nbytes=4132
nbytes=4164
nbytes=4196
nbytes=4228
nbytes=4260
nbytes=4292
nbytes=4324
nbytes=4356
nbytes=4388
nbytes=4420
nbytes=4452
nbytes=4484
nbytes=4516
nbytes=4548
nbytes=4580
nbytes=4612
nbytes=4644
nbytes=4676
nbytes=4708
nbytes=4740
nbytes=4772
nbytes=4804
nbytes=4836
nbytes=4868
nbytes=4900
nbytes=4932
nbytes=4964
nbytes=4996
nbytes=5028
nbytes=5060
nbytes=5092
nbytes=5124
nbytes=5156
nbytes=5188
nbytes=5220
nbytes=5252
nbytes=5284
nbytes=5316
nbytes=5348
nbytes=5380
nbytes=5412
nbytes=5444
nbytes=5476
nbytes=5508
nbytes=5540
nbytes=5572
nbytes=5604
nbytes=5636
nbytes=5668
nbytes=5700
nbytes=5732
nbytes=5764
nbytes=5796
nbytes=5828
nbytes=5860
nbytes=5892
nbytes=5924
nbytes=5956
nbytes=5988
nbytes=6020
nbytes=6052
nbytes=6084
nbytes=6116
nbytes=6148
nbytes=6180
nbytes=6212
nbytes=6244
nbytes=6276
nbytes=6308
nbytes=6340
nbytes=6372
nbytes=6404
nbytes=6436
nbytes=6468
nbytes=6500
nbytes=6532
nbytes=6564
nbytes=6596
nbytes=6628
nbytes=6660
nbytes=6692
nbytes=6724
nbytes=6756
nbytes=6788
nbytes=6820
nbytes=6852
nbytes=6884
nbytes=6916
nbytes=6948
nbytes=6980
nbytes=7012
nbytes=7044
nbytes=7076
nbytes=7108
nbytes=7140
nbytes=7172
nbytes=7204
nbytes=7236
nbytes=7268
nbytes=7300
nbytes=7332
nbytes=7364
nbytes=7396
nbytes=7428
nbytes=7460
nbytes=7492
nbytes=7524
nbytes=7556
nbytes=7588
nbytes=7620
nbytes=7652
nbytes=7684
nbytes=7716
nbytes=7748
nbytes=7780
nbytes=7812
nbytes=7844
nbytes=7876
nbytes=7908
nbytes=7940
nbytes=7972
nbytes=8004
nbytes=8036
nbytes=8068
nbytes=8100
nbytes=8132
nbytes=8164
nbytes=8196
nbytes=8228
nbytes=8260
nbytes=8292
nbytes=8324
nbytes=8356
nbytes=8388
nbytes=8420
nbytes=8452
nbytes=8484
nbytes=8516
nbytes=8548
nbytes=8580
nbytes=8612
nbytes=8644
nbytes=8676
nbytes=8708
nbytes=8740
nbytes=8772
nbytes=8804
nbytes=8836
nbytes=8868
nbytes=8900
nbytes=8932
nbytes=8964
nbytes=8996
nbytes=9028
nbytes=9060
nbytes=9092
nbytes=9124
nbytes=9156
nbytes=9188
nbytes=9220
nbytes=9252
nbytes=9284
nbytes=9316
nbytes=9348
nbytes=9380
nbytes=9412
nbytes=9444
nbytes=9476
nbytes=9508
nbytes=9540
nbytes=9572
nbytes=9604
nbytes=9636
nbytes=9668
nbytes=9700
nbytes=9732
nbytes=9764
nbytes=9796
nbytes=9828
nbytes=9860
nbytes=9892
nbytes=9924
nbytes=9956
nbytes=9988
nbytes=10020
nbytes=10052
nbytes=10084
nbytes=10116
nbytes=10148
nbytes=10180
nbytes=10212
nbytes=10244
nbytes=10276
nbytes=10308
nbytes=10340
nbytes=10372
nbytes=10404
nbytes=10436
nbytes=10468
nbytes=10500
nbytes=10532
nbytes=10564
nbytes=10596
nbytes=10628
nbytes=10660
nbytes=10692
nbytes=10724
nbytes=10756
nbytes=10788
nbytes=10820
nbytes=10852
nbytes=10884
nbytes=10916
nbytes=10948
nbytes=10980
nbytes=11012
nbytes=11044
nbytes=11076
nbytes=11108
nbytes=11140
nbytes=11172
nbytes=11204
nbytes=11236
nbytes=11268
nbytes=11300
nbytes=11332
nbytes=11364
nbytes=11396
nbytes=11428
nbytes=11460
nbytes=11492
nbytes=11524
nbytes=11556
nbytes=11588
nbytes=11620
nbytes=11652
nbytes=11684
nbytes=11716
nbytes=11748
nbytes=11780
nbytes=11812
nbytes=11844
nbytes=11876
nbytes=11908
nbytes=11940
nbytes=11972
nbytes=12004
nbytes=12036
nbytes=12068
nbytes=12100
nbytes=12132
nbytes=12164
nbytes=12196
nbytes=12228
nbytes=12260
nbytes=12292
nbytes=12324
nbytes=12356
nbytes=12388
nbytes=12420
nbytes=12452
nbytes=12484
nbytes=12516
nbytes=12548
nbytes=12580
nbytes=12612
nbytes=12644
nbytes=12676
nbytes=12708
nbytes=12740
nbytes=12772
nbytes=12804
nbytes=12836
nbytes=12868
nbytes=12900
nbytes=12932
nbytes=12964
nbytes=12996
nbytes=13028
nbytes=13060
nbytes=13092
nbytes=13124
nbytes=13156
nbytes=13188
nbytes=13220
nbytes=13252
nbytes=13284
nbytes=13316
nbytes=13348
nbytes=13380
nbytes=13412
nbytes=13444
nbytes=13476
nbytes=13508
nbytes=13540
nbytes=13572
nbytes=13604
nbytes=13636
nbytes=13668
nbytes=13700
nbytes=13732
nbytes=13764
nbytes=13796
nbytes=13828
nbytes=13860
nbytes=13892
nbytes=13924
nbytes=13956
nbytes=13988
nbytes=14020
nbytes=14052
nbytes=14084
nbytes=14116
nbytes=14148
nbytes=14180
nbytes=14212
nbytes=14244
nbytes=14276
nbytes=14308
nbytes=14340
nbytes=14372
nbytes=14404
nbytes=14436
nbytes=14468
nbytes=14500
nbytes=14532
nbytes=14564
nbytes=14596
nbytes=14628
nbytes=14660
nbytes=14692
nbytes=14724
nbytes=14756
nbytes=14788
nbytes=14820
nbytes=14852
nbytes=14884
nbytes=14916
nbytes=14948
nbytes=14980
nbytes=15012
nbytes=15044
nbytes=15076
nbytes=15108
nbytes=15140
nbytes=15172
nbytes=15204
nbytes=15236
nbytes=15268
nbytes=15300
nbytes=15332
nbytes=15364
nbytes=15396
nbytes=15428
nbytes=15460
nbytes=15492
nbytes=15524
nbytes=15556
nbytes=15588
nbytes=15620
nbytes=15652
nbytes=15684
nbytes=15716
nbytes=15748
nbytes=15780
nbytes=15812
nbytes=15844
nbytes=15876
nbytes=15908
nbytes=15940
nbytes=15972
nbytes=16004
nbytes=16036
nbytes=16068
nbytes=16100
nbytes=16132
nbytes=16164
nbytes=16196
nbytes=16228
nbytes=16260
nbytes=16292
nbytes=16324
nbytes=16356
nbytes=16388

With a simple exponential growth factor:

js> var x = []; for (var i = 0; i < 4096; ++i) x.push(1);
nbytes=108
nbytes=8
nbytes=4
nbytes=108
nbytes=126
nbytes=12
nbytes=36
nbytes=68
nbytes=132
nbytes=260
nbytes=516
nbytes=1028
nbytes=2052
nbytes=4100
nbytes=8196
nbytes=16388
Priority: -- → P3
Target Milestone: --- → mozilla1.9.1
Attached patch patchSplinter Review
Assignee: general → gal
Attachment #363335 - Attachment is patch: true
Attachment #363335 - Attachment mime type: application/octet-stream → text/plain
that probably won't make much different in performance or anything.  jemalloc and the mac allocator will resize in-place where they can, and since allocations are chunked most of the previous ones won't actually change size and will just give you back the same pointer
Testcase:

var x = [];
var y = [];

var t = Date.now();
for (var i = 0; i < 1000000; ++i)
    x[i] = y[i] = 0;
print(Date.now() - t);

Without the patch:

whale:src gal$ ./Darwin_OPT.OBJ/js z.js
125
whale:src gal$ ./Darwin_OPT.OBJ/js -j z.js
73

With the patch:

whale:src gal$ ./Darwin_OPT.OBJ/js z.js
96
whale:src gal$ ./Darwin_OPT.OBJ/js -j z.js
46
Brendan is suggesting to limit the growth to a large increment past a certain threshold to avoid 2GB -> 4GB jumps and such.
Like I said, I don't see much point in adding this at all given our allocator's behavior.  A more interesting log would be to look at the pointers you get back from realloc and see when they actually change.
hmm, looking at your testcase again, it might be more useful on Mac than on Windows or Linux.  Do you have numbers from those?
Binary-exponential growth in the JS array impl is still good to reduce overhead, even if malloc size-classifies and grows by doubling up to a point.

/be
Status: NEW → RESOLVED
Closed: 15 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: