Runtime String Replacement vs. Pre-processed String Arrays (v4)

Revision 4 of this benchmark created by Charlie Fiskeaux on


Setup

var ref = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    
    var dp = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1];
    
    var formula = "=A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+AA+AB+AC+AD+AE+AF+AG+AH+AI+AJ+AK+AL+AM+AN+AO+AP+AQ+AR+AS+AT+AU+AV+AW+AX+AY+AZ+BA+BB+BC+BD+BE+BF+BG+BH+BI+BJ+BK+BL+BM+BN+BO+BP+BQ+BR+BS+BT+BU+BV+BW+BX+BY+BZ+CA+CB+CC+CD+CE+CF+CG+CH+CI+CJ+CK+CL+CM+CN+CO+CP+CQ+CR+CS+CT+CU+CV+CW+CX+CY+CZ+DA+DB+DC+DD+DE+DF+DG";
    
    var formula_arr = ["=","A","+","B","+","C","+","D","+","E","+","F","+","G","+","H","+","I","+","J","+","K","+","L","+","M","+","N","+","O","+","P","+","Q","+","R","+","S","+","T","+","U","+","V","+","W","+","X","+","Y","+","Z","+","AA","+","AB","+","AC","+","AD","+","AE","+","AF","+","AG","+","AH","+","AI","+","AJ","+","AK","+","AL","+","AM","+","AN","+","AO","+","AP","+","AQ","+","AR","+","AS","+","AT","+","AU","+","AV","+","AW","+","AX","+","AY","+","AZ","+","BA","+","BB","+","BC","+","BD","+","BE","+","BF","+","BG","+","BH","+","BI","+","BJ","+","BK","+","BL","+","BM","+","BN","+","BO","+","BP","+","BQ","+","BR","+","BS","+","BT","+","BU","+","BV","+","BW","+","BX","+","BY","+","BZ","+","CA","+","CB","+","CC","+","CD","+","CE","+","CF","+","CG","+","CH","+","CI","+","CJ","+","CK","+","CL","+","CM","+","CN","+","CO","+","CP","+","CQ","+","CR","+","CS","+","CT","+","CU","+","CV","+","CW","+","CX","+","CY","+","CZ","+","DA","+","DB","+","DC","+","DD","+","DE","+","DF","+","DG"];

Teardown


    if (window.hasOwnProperty('console')) console.log(new_formula);
  

Test runner

Ready to run.

Testing in
TestOps/sec
Runtime String Replacement
var new_formula = formula.replace(/([A-Z]{1,2})/g, function ($1) {
        var split = $1.match(/([A-Z])([A-Z]?)/);
        var idx = ref.indexOf(split[0]);
        if ( split[2] ) {
            idx = ((ref.indexOf(split[1]) + 1) * 26) + ref.indexOf(split[2]);
        }
        if (dp[idx]) {
            return dp[idx];
        }
    });
ready
Pre-Processed String Array
var new_formula = '';
for (var d=0,dlen=formula_arr.length; d<dlen; ++d) {
    var token = formula_arr[d];
    if (token.match(/^[A-Z]+$/)) {
        var idx = ref.indexOf(token[0]);
        if (2 == token.length) {
            idx = ((ref.indexOf(token[0]) + 1) * 26) + ref.indexOf(token[1]);
        }
        token = dp[idx] || 0;
    }
    new_formula += token;
}
ready
Runtime Tokenized String
var new_formula = '',
    held_token = '';
for (var d=0,dlen=formula.length; d<dlen; ++d) {
    var token = formula[d],
        idx   = ref.indexOf(token);
    // if token is a letter
    if (~idx) {
        if (held_token) {
            idx = ((ref.indexOf(held_token) + 1) * 26) + ref.indexOf(token);
            held_token = '';
        }
        else {
            held_token = token;
            continue;
        }
        token = dp[idx] || 0;
    }
    // if token is not a letter but we have a held token
    else if (held_token) {
        new_formula += (dp[ref.indexOf(held_token)] || 0) + token;
        held_token = '';
        continue;
    }
    new_formula += token;
}
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 4: published by Charlie Fiskeaux on