Quantcast
Viewing all articles
Browse latest Browse all 19

Answer by KevinHJ for String length in bytes in JavaScript

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));

Viewing all articles
Browse latest Browse all 19

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>