Closed Bug 579475 Opened 14 years ago Closed 14 years ago

JM: Make JSOP_SETELEM on dense arrays faster

Categories

(Core :: JavaScript Engine, defect)

defect
Not set
normal

Tracking

()

RESOLVED DUPLICATE of bug 584917

People

(Reporter: dmandelin, Unassigned)

References

Details

Make this fast:

    function f() {
      var a = new Array(100);
      for (var i = 0; i < 100; ++i)
        a[i] = false;

      var t0 = new Date;
      for (var i = 0; i < 27000; ++i) {
        for (var j = 0; j < 100; ++j)
          a[j] = false;
      }
      print(new Date - t0);
    }

    f();

SunSpider does about 2.7M dense array sets. 

JM wanted SS win: 5 ms
Where are you getting 5ms from for this one?  I get these times:

JM: 13ms
JSC: 12ms
V8: 9ms

Commenting out the 'a[j] = false', I get these times:

JM: 7ms
JSC: 6ms
V8: 4ms

It looks like most of the differences are due to general loop stuff (loop variable register allocation, interrupt checks) rather than to differences in setelem.
On buildmonkey-right, I get:

              empty-loop version           original ubench
  JM                  8                           16
  JSC                 7                           12

I'm not too surprised you don't see a difference, though. Perf differences for JSC vs. JM on filling arrays seem to depend a lot on the size of the array, so there is probably something funny going on.
By the way, I came up with this bug mostly from profiling crypto-aes and seeing that we spend 13% of our time in setelem. Maybe that is not really a slowdown for us, though. You might want to check on that benchmark and see if you can find the slowdowns elsewhere.
This also slows down access-nsieve. Reduced testcase:
-----------
function test(arr) {
  for(var i=0; i<40000; i++) 
    arr[i] = true;
}

var t0 = new Date;

for(var x=0; x<5; x++) {
    var arr = Array(40000);
    test(arr);
}
print((new Date)-t0);
-----------
On my P4 I get these times:

- JM: 13 ms.
- TM: 9 ms.
- V8: 4 ms.
Note that replacing arr[i] with arr[0] reduces JM time to 2 ms., so loop and call overhead is not that big here.
(In reply to comment #5)
> Note that replacing arr[i] with arr[0] reduces JM time to 2 ms., so loop and
> call overhead is not that big here.

This is stressing setelem on holes, see bug 580355.
(In reply to comment #6)
> (In reply to comment #5)
> > Note that replacing arr[i] with arr[0] reduces JM time to 2 ms., so loop and
> > call overhead is not that big here.
> 
> This is stressing setelem on holes, see bug 580355.

Sorry. Great results there btw :)
(In reply to comment #8)
> Is this fixed by bug 580355?

No difference between tip and revision aabc31b1b29e (right before bug 580355 landed) for the test case in comment 1. The code in comment 4 got much faster, as Brian Hackett predicted.
Comment 1 isn't timing the hole-setting path AFAICT, because the loop outside of the timing region fills the array.
This seems like it's still biting us. We are *much* slower than V8 on this:

    function f() {
        for (var i = 0; i < 1000000; ++i) {
            var a = new Array(4);
            a[0] = 33;
        }
    }

    var t0 = new Date;
    f();        
    print(new Date - t0);

We are 60 ms slower (on a fast Windows machine) on the 'new Array' part. That's not such a big deal: in SunSpider there are about 27000 'new Array', so we are losing only 1-2 ms here. But that's about a 5x slowdown, and it may bite more on other workloads, so we should fix that too.

We are 196 ms slower on the 'a[0] = 33' part, or about 60x slower (199 ms vs 3 ms for that part). If I add 3 more sets, we get only 26 ms slower than that, or about 4x (35 ms vs. 9 ms). So, something is very bad the first time we set a value on an array.
This will be fixed by bug 584917.  The assign to a[0] currently mallocs an array, and it won't with 584917 (slots allocated inline).  584917 is ready to go; it will probably conflict somewhat with the compartments stuff blocking beta 7 so I'm waiting for that to land first.
Can this now be resolved, per the implementation of bug 584917 mentioned in comment 12?
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.