peterS.: qualitaetssicherung + minitest: Array.getStringTypesLength

Beitrag lesen

gruss wahsaga,

Ist es an dieser Stelle irgendwie performanter, die Strings erst in ein Array zu pushen,
dieses dann zu joinen, und die length des Ergebnisses zu ermitteln - anstatt einfach die
length der einzelnen Elemente vom Typ String in der Schleife aufzusummieren?

darueber hab' ich noch gar nicht richtig nachgedacht - [Array.join] ist aber sauschnell.
zumindest was die konkatenation von string-werten angeht, ist es dem "+" operator haushoch
ueberlegen.

bei einer grossen anzahl von eintraegen 1000? ... 10.000 ist es aber doch nicht ganz so klug,
alle string-typen als referenz in einem zweiten array zwischenzuspeichern - dieser vorgang
belegt ja adressraum - das direkte addieren der jeweilige laenge eines passenden eintrags auf
genau eine adresse ist da in der tat viel billiger.

ich hab' dazu mal schnell einen test geschrieben - das ergebnis fuer den einsatz beider zuvor
geposteten methoden ist niederschmetternd:

methode a) - arbeitet mit einer for-schleife und blaesst intern ein array auf.
methode b) - arbeitet mit dem iterator [Array.filter] und nutzt intern ebenfalls ein array.

methode c) - arbeitet mit einer for-schleife und addiert auf eine adresse.
methode d) - arbeitet mit dem iterator [Array.forEach] und addiert ebenfalls.

c)
  ~~~javascript Array.prototype.getStringTypesLength = function () {

var i, obj, length = 0;
    for (i = 0; i<this.length; ++i) {

obj = this[i];
      if ((typeof obj == "string") || (obj instanceof String)) {

length += obj.length;
      }
    }
    return length;
  };
//javascript:Array.prototype.getStringTypesLength = function () {var i,obj,length=0;for(i=0;i<this.length;++i){obj=this[i];if((typeof obj=="string")||(obj instanceof String)){length+=obj.length;}}return length;};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());

  
d)  
  ~~~javascript
Array.prototype.getStringTypesLength = function () {  
  
    var length = 0;  
  
    this.forEach(function (elm) {  
      if ((typeof elm == "string") || (elm instanceof String)) {  
        length += obj.length;  
      }  
    });  
  
    return length;  
  };  
//javascript:Array.prototype.getStringTypesLength = function () {var length=0;this.forEach(function(elm){if((typeof elm=="string")||(elm instanceof String)){length+=elm.length;}});return length;};alert(["hallo", "welt", {}, [], , "", 1, (new String("Baum")), "Haus", Number.NaN, String(42)].getStringTypesLength());

testcase:

~~~javascript (function () {

var str = "Sed turpis. In porta est a enim. Nam velit. Nullam nec tellus. Mauris lacinia quam eget tellus. Pellentesque fringilla. Maecenas in neque vitae leo fermentum iaculis. Sed dolor erat, pretium vitae, dictum eget, luctus vitae, mauris. Quisque vehicula velit quis diam. Morbi posuere scelerisque lacus. Nunc metus. Vestibulum lorem nisl, malesuada dignissim, pretium sed, auctor a, sapien. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla placerat elit et dolor. Morbi est. Aenean id est. Proin eu massa. Nullam hendrerit. Praesent blandit convallis dui.";
    var loops = 10000;
    var arr = []; for (var i=0; i<loops; ++i) {arr.push(str);}
    var time = new Date();
    var length = arr.getStringTypesLength();
    time = (new Date()) - time;

alert("zeit fuer " + loops + " eintraege mit je " + str.length + " zeichen : " + time + " msec");
  })();
//(function () {var str = "Sed turpis. In porta est a enim. Nam velit. Nullam nec tellus. Mauris lacinia quam eget tellus. Pellentesque fringilla. Maecenas in neque vitae leo fermentum iaculis. Sed dolor erat, pretium vitae, dictum eget, luctus vitae, mauris. Quisque vehicula velit quis diam. Morbi posuere scelerisque lacus. Nunc metus. Vestibulum lorem nisl, malesuada dignissim, pretium sed, auctor a, sapien. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla placerat elit et dolor. Morbi est. Aenean id est. Proin eu massa. Nullam hendrerit. Praesent blandit convallis dui.";var loops = 10000;var arr = []; for (var i=0; i<loops; ++i) {arr.push(str);}var time = new Date();var length = arr.getStringTypesLength();time = (new Date()) - time;alert("zeit fuer " + loops + " eintraege mit je " + str.length + " zeichen : " + time + " msec");})();

  
  
ergebnisse:  
  
a) + 10.000 loops: 46.389 msec  
b) + 10.000 loops: 46.249 msec  
c) + 10.000 loops:    125 msec  
d) + 10.000 loops:     93 msec  
  
  
vielen dank wahsaga fuer die qualitaetssicherung - empfohlen wird der einsatz von c) und d).  
  
  
  
so long - peterS. - pseliger@gmx.net  
  
  

-- 
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
  
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]