{"ScriptPreparationCode":"/**\r\n * Creates function, whose body contains generated switch.\r\n *\r\n * @return function(expression) { switch generated from {@code fromObject} keys and values }\r\n */\r\nfunction createFnSwitch(fromObject) {\r\n var body = \u0027switch (expression) {\\n\u0027\r\n\r\n Object.entries(fromObject).forEach(([key, value]) =\u003E {\r\n body \u002B= \u0022 case \u0027\u0022 \u002B key \u002B \u0022\u0027:\\n\u0022\r\n \u002B \u0022 return \u0027\u0022 \u002B value \u002B \u0022\u0027;\\n\u0022;\r\n });\r\n\r\n body \u002B= \u0027}\\n\u0027;\r\n\r\n return new Function(\u0027expression\u0027, body);\r\n}\r\n\r\n/**\r\n * Creates function, whose body contains generated if-else.\r\n *\r\n * @return function(expression) { if-else generated from {@code fromObject} keys and values }\r\n */\r\nfunction createFnIfElse(fromObject) {\r\n var body = \u0027\u0027;\r\n\r\n Object.entries(fromObject).forEach(([key, value]) =\u003E {\r\n body \u002B= \u0022if (expression == \u0027\u0022 \u002B key \u002B \u0022\u0027) {\\n\u0022\r\n \u002B \u0022 return \u0027\u0022 \u002B value \u002B \u0022\u0027;\\n\u0022\r\n \u002B \u0022} else \u0022;\r\n });\r\n \r\n body = body.substring(0, body.length - \u0022 else \u0022.length);\r\n\r\n return new Function(\u0027expression\u0027, body);\r\n}\r\n\r\n/**\r\n * Creates object of passed {@code length} with keys and values obtained from {@code fnKeyValueProvider}.\r\n *\r\n * @param length\r\n * @param fnKeyValueProvider = (i) =\u003E {key: desired property key, value: desired property value}\r\n */\r\nfunction createObject(length, fnKeyValueProvider) {\r\n var object = {};\r\n for (var i = 0; i \u003C length; i\u002B\u002B) {\r\n var kv = fnKeyValueProvider(i);\r\n object[kv.key] = kv.value;\r\n }\r\n return object;\r\n}\r\n\r\n/**\r\n * Creates function for returning {@code object} values.\r\n *\r\n * @return (key) =\u003E object[key]\r\n */\r\nfunction createFnObject(object) {\r\n return (key) =\u003E object[key];\r\n}\r\n\r\n// prepare tests\r\nvar tests = {\r\n one: {size: 1},\r\n two: {size: 2},\r\n four: {size: 4},\r\n ten: {size: 10},\r\n fifty: {size: 50},\r\n thousand: {size: 1000}\r\n};\r\nvar keyValueProvider = i =\u003E ({key: i \u002B \u0027-key\u0027, value: i \u002B \u0027-value\u0027});\r\nObject.values(tests).forEach(test =\u003E {\r\n test.object = createObject(test.size, keyValueProvider);\r\n test.middleKey = keyValueProvider(Math.floor(test.size / 2)).key;\r\n\r\n test.fnSwitch = createFnSwitch(test.object);\r\n test.fnIfElse = createFnIfElse(test.object);\r\n test.fnObject = createFnObject(test.object);\r\n});\r\n\r\n// use result to prevent possible js engine optimization\r\nvar res;\r\n\r\n// test switch\r\nfunction testSwitch(test) {\r\n res = test.fnSwitch(test.middleKey);\r\n}\r\n\r\n// test if-else\r\nfunction testIfElse(test) {\r\n res = test.fnIfElse(test.middleKey);\r\n}\r\n\r\n// test object\r\nfunction testObject(test) {\r\n res = test.fnObject(test.middleKey);\r\n}\r\n","TestCases":[{"Name":"Switch 1 case","Code":"testSwitch(tests.one);","IsDeferred":false},{"Name":"Switch 1k cases","Code":"testSwitch(tests.thousand);","IsDeferred":false},{"Name":"Object 50 props","Code":"testObject(tests.fifty);","IsDeferred":false},{"Name":"If-else 50 cases","Code":"testIfElse(tests.fifty);","IsDeferred":false},{"Name":"Switch 50 cases","Code":"testSwitch(tests.fifty);","IsDeferred":false},{"Name":"Object 10 props","Code":"testObject(tests.ten);","IsDeferred":false},{"Name":"If-else 10 cases","Code":"testIfElse(tests.ten);","IsDeferred":false},{"Name":"Switch 10 cases","Code":"testSwitch(tests.ten);","IsDeferred":false},{"Name":"Object 4 props","Code":"testObject(tests.four);","IsDeferred":false},{"Name":"If-else 4 cases","Code":"testIfElse(tests.four);","IsDeferred":false},{"Name":"Switch 4 cases","Code":"testSwitch(tests.four);","IsDeferred":false},{"Name":"Object 2 props ","Code":"testObject(tests.two);","IsDeferred":false},{"Name":"If-else 2 cases","Code":"testIfElse(tests.two);","IsDeferred":false},{"Name":"Switch 2 cases","Code":"testSwitch(tests.two);","IsDeferred":false},{"Name":"Object 1 prop ","Code":"testObject(tests.one);","IsDeferred":false},{"Name":"If-else 1 case","Code":"testIfElse(tests.one);","IsDeferred":false},{"Name":"If-else 1k cases","Code":"testIfElse(tests.thousand);","IsDeferred":false},{"Name":"Object 1k props","Code":"testObject(tests.thousand);","IsDeferred":false}]}