I compared some of the methods suggested here in Firefox for speed.
The string I used contained the following characters:😀œ´®†¥¨ˆøπ¬˚∆˙©ƒ∂ßåΩ≈ç√∫˜µ≤
All results are averages of 3 runs each. Times are in milliseconds. Note that all URIEncoding methods behaved similarly and had extreme results, so I only included one.
While there are some fluctuations based on the size of the string, the charCode methods (lovasoa and fuweichin) both perform similarly and the fastest overall, with fuweichin's charCode method the fastest. The Blob and TextEncoder methods performed similarly to each other. Generally the charCode methods were about 75% faster than the Blob and TextEncoder methods. The URIEncoding method was basically unacceptable.
Here are the results I got:
Size 6.4 * 10^6 bytes:
Lauri Oherd – URIEncoding: 6400000 et: 796lovasoa – charCode: 6400000 et: 15fuweichin – charCode2: 6400000 et: 16simap – Blob: 6400000 et: 26Riccardo Galli – TextEncoder: 6400000 et: 23
Size 19.2 * 10^6 bytes:Blob does kind of a weird thing here.
Lauri Oherd – URIEncoding: 19200000 et: 2322lovasoa – charCode: 19200000 et: 42fuweichin – charCode2: 19200000 et: 45simap – Blob: 19200000 et: 169Riccardo Galli – TextEncoder: 19200000 et: 70
Size 64 * 10^6 bytes:
Lauri Oherd – URIEncoding: 64000000 et: 12565lovasoa – charCode: 64000000 et: 138fuweichin – charCode2: 64000000 et: 133simap – Blob: 64000000 et: 231Riccardo Galli – TextEncoder: 64000000 et: 211
Size 192 * 10^6 bytes:URIEncoding methods freezes browser at this point.
lovasoa – charCode: 192000000 et: 754fuweichin – charCode2: 192000000 et: 480simap – Blob: 192000000 et: 701Riccardo Galli – TextEncoder: 192000000 et: 654
Size 640 * 10^6 bytes:
lovasoa – charCode: 640000000 et: 2417fuweichin – charCode2: 640000000 et: 1602simap – Blob: 640000000 et: 2492Riccardo Galli – TextEncoder: 640000000 et: 2338
Size 1280 * 10^6 bytes:Blob & TextEncoder methods are starting to hit the wall here.
lovasoa – charCode: 1280000000 et: 4780fuweichin – charCode2: 1280000000 et: 3177simap – Blob: 1280000000 et: 6588Riccardo Galli – TextEncoder: 1280000000 et: 5074
Size 1920 * 10^6 bytes:
lovasoa – charCode: 1920000000 et: 7465fuweichin – charCode2: 1920000000 et: 4968JavaScript error: file:///Users/xxx/Desktop/test.html, line 74: NS_ERROR_OUT_OF_MEMORY:
Here is the code:
function byteLengthURIEncoding(str) { return encodeURI(str).split(/%..|./).length - 1;}function byteLengthCharCode(str) { // returns the byte length of an utf8 string var s = str.length; for (var i=str.length-1; i>=0; i--) { var code = str.charCodeAt(i); if (code > 0x7f && code <= 0x7ff) s++; else if (code > 0x7ff && code <= 0xffff) s+=2; if (code >= 0xDC00 && code <= 0xDFFF) i--; //trail surrogate } return s;}function byteLengthCharCode2(s){ //assuming the String is UCS-2(aka UTF-16) encoded var n=0; for(var i=0,l=s.length; i<l; i++){ var hi=s.charCodeAt(i); if(hi<0x0080){ //[0x0000, 0x007F] n+=1; }else if(hi<0x0800){ //[0x0080, 0x07FF] n+=2; }else if(hi<0xD800){ //[0x0800, 0xD7FF] n+=3; }else if(hi<0xDC00){ //[0xD800, 0xDBFF] var lo=s.charCodeAt(++i); if(i<l&&lo>=0xDC00&&lo<=0xDFFF){ //followed by [0xDC00, 0xDFFF] n+=4; }else{ throw new Error("UCS-2 String malformed"); } }else if(hi<0xE000){ //[0xDC00, 0xDFFF] throw new Error("UCS-2 String malformed"); }else{ //[0xE000, 0xFFFF] n+=3; } } return n;}function byteLengthBlob(str) { return new Blob([str]).size;}function byteLengthTE(str) { return (new TextEncoder().encode(str)).length;}var sample = "😀œ´®†¥¨ˆøπ¬˚∆˙©ƒ∂ßåΩ≈ç√∫˜µ≤i";var string = "";// Adjust multiplier to change length of string.let mult = 1000000;for (var i = 0; i < mult; i++) { string += sample;}let t0;try { t0 = Date.now(); console.log("Lauri Oherd – URIEncoding: "+ byteLengthURIEncoding(string) +" et: "+ (Date.now() - t0));} catch(e) {}t0 = Date.now();console.log("lovasoa – charCode: "+ byteLengthCharCode(string) +" et: "+ (Date.now() - t0));t0 = Date.now();console.log("fuweichin – charCode2: "+ byteLengthCharCode2(string) +" et: "+ (Date.now() - t0));t0 = Date.now();console.log("simap – Blob: "+ byteLengthBlob(string) +" et: "+ (Date.now() - t0));t0 = Date.now();console.log("Riccardo Galli – TextEncoder: "+ byteLengthTE(string) +" et: "+ (Date.now() - t0));