Daniel Thoma: Benchmark

Beitrag lesen

Hallo zusammen!

Der benchmark ist in so fern schlecht, als er das Entscheiden zwischen wenigen Fällen sehr oft testet.
Da ergeben sich natürlich kaum nennenswerte Unterschiede. Wenn ein switch (oder der Objektzugriff) Geschwindigkeitsvorteile bringt, dann bei sehr vielen Fällen. Außerdem sollte man die Werte so wählen, dass ein Vergleich relativ viel Zeit benötigt.
Daher noch mal ein anderer Benchmark:

<html>
<head>
<title></title>
<script type="text/javascript">
  function test() {
    var anzahl_werte = prompt("Anzahl Werte", "2000");
    var anzahl_tests = prompt("Anzahl Tests", "1000");
    var werte = new Array();
    for(var i = 0; i < anzahl_werte; i++) {
      werte.push("'w" + Math.floor(Math.random() * 10) + "'");
    }
    var code = "var result = 0;\n"
    code += "wert = " + werte[Math.floor(anzahl_werte / 2)] + ";\n";
    code += "var werte = new Array(" + werte.join(',') + ")\n\n";

code += "var time_if = (new Date()).getTime();\n";
    code += "for(var i = 0; i < " + anzahl_tests + "; i++) {\n";
    for(var i = 0; i < anzahl_werte; i++) {
      if(i != 0) {
        code += "else ";
      }
      code += "if(wert == " + werte[i] + ") {result = " + i + ";}\n";
    }
    code += "}\n";
    code += "time_if = (new Date()).getTime() - time_if;\n\n";

code += "var time_case = (new Date()).getTime();\n";
    code += "for(var i = 0; i < " + anzahl_tests + "; i++) {\n";
    code += "switch(wert) {\n";
    for(var i = 0; i < anzahl_werte; i++) {
      code += "case " + werte[i] + ": result = " + i + "; break;\n";
    }
    code += "}\n";
    code += "}\n";
    code += "time_case = (new Date()).getTime() - time_case;\n\n";

code += "var time_obj = (new Date()).getTime();\n";
    code += "for(var i = 0; i < " + anzahl_tests + "; i++) {\n";
    code += "result = werte[wert];\n"
    code += "}\n";
    code += "time_obj = (new Date()).getTime() - time_obj;\n\n";

code += "alert('IF: ' + time_if + '\n' + 'CASE: ' + time_case + '\n' + 'OBJ: ' + time_obj + '\n');";

var funktion = new Function(code);
    alert("start");
    funktion();
  }
</script>
</head>
<body>
<p>
<input type="button" value="start" onclick="test()" />
</p>
</body>
</html>

Mit dem Mozilla sieht man dann sehr deutlich, dass sowohl if als auch switch in linearer Zeit arbeiten. Allerdings ist switch sehr viel schneller. U.u. wird bei if else konstrukten Rekursion verwendet.

Obj arbeitet in konstanter Zeit, was stark dafür spricht, dass es als Hashtabelle implementiert ist.

Noch eine Frage: Was soll ein Heap bei der Implementierung von switch bringen?

Grüße

Daniel