Rolf B: Performance JS-Function

Beitrag lesen

Hallo Robert,

code = ev.target === ta + 2 * !!ev.shiftKey + 4 * !!ev.ctrlKey + 8 * ev.altKey;

Meinst Du, das ist tatsächlich signifikant schneller als

code = (ev.target === ta ? 1 : 0) + (ev.shiftKey ? 2 : 0) + (ev.ctrlKey ? 4 : 0) + (ev.altKey ? 8 : 0)?

bindings[ev.target][ev.shiftKey][ev.ctrlKey][ev.altKey];

Ich denke, du meinst hier an erster Stelle den Keyname und nicht das Target, oder? ev.target ist ein DOM Objekt, das kann man nicht als Property-Key verwenden. Ansonsten hatte ich mir das auch schon überlegt; aber damit das funktioniert musst Du für jeden key drei Arraydimensionen erzeugen um nicht beim Auslesen versehentlich ins Nichts zu greifen und ein "cannot read property 'false' of undefined" zu bekommen.

bindings = {
   "a": { false: { false: { false: null, true: null }, true: { false: HandleCtrlA, true: null },
          true:  { false: { false: null, true: null }, true: { false: null, true: null } }

Finde ich jetzt schwer lesbar und wartbar, bzw. man müsste dann einen Helper schreiben der diese Struktur aus einer lesbaren Definition aufbaut.

Oder Du musst Dich Schritt für Schritt durch die Kette hangeln und jedesmal prüfen, ob der Wert existiert. Oder einen try/catch drumherumlegen. Aber das ist beides nicht sonderlich fix. Die Prüfkette ist vermutlich noch fixer als ein Exception-Kontext.

Die Code-Bitmap gefällt mir da noch am besten. Statt ihrer könnte man auch ein "Ctrl-", "Alt-" und "Shift-" vor den Keyname setzen und damit in die Bindings einsteigen, das verbessert die Lesbarkeit immens. Das Finden eines Property über seinen Namen sollte sehr schnell gehen, das wird in der JS-Runtime durch eine Hashtable unterstützt.

Übrigens, beatovich, ArrowUp/-Down/-Left/-Right heißt Up/Down/Left/Right im Internet-Explorer!

Rolf

--
sumpsi - posui - clusi