Closed Bug 1382639 Opened 7 years ago Closed 2 years ago

String iteration over a rope can be slow

Categories

(Core :: JavaScript Engine: JIT, enhancement, P3)

enhancement

Tracking

()

RESOLVED DUPLICATE of bug 1784478

People

(Reporter: anba, Unassigned)

Details

(Keywords: triage-deferred)

Attachments

(1 file)

It can be slow for basically the same reason as in bug 1331136: We won't flatten the rope because of the optimization in JSString::getChar(), which means we always call into the runtime to retrieve char.

Example benchmark:
    var q = 0;
    var dt = 0;
    for (var i = 0; i < 1000000; ++i) {
        var s = "a".repeat(15);
        s = s.split("").join(""); // flatten
        s = s + s; // rope

        var t = dateNow();
        for (var k of s) ++q;
        dt += dateNow() - t;
    }
    print(dt, q);

This µ-benchmark currently completes in ~525ms for me, adding support to load a char from right-hand side of a rope to MacroAssembler::loadStringChar() (see attached patch) would improve it to ~380ms. 

The question is now whether or not it's worth it to handle the rhs of a rope in MacroAssembler::loadStringChar()?
Keywords: triage-deferred
Priority: -- → P3

The patch in bug 1784478 improves this from ~1130 ms to ~611 ms for me.

Status: NEW → RESOLVED
Closed: 2 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: