OLD | NEW |
(Empty) | |
| 1 <html> |
| 2 <head> |
| 3 <script> |
| 4 function shouldBe(str1, str2) { |
| 5 var result1; |
| 6 try { |
| 7 result1 = eval(str1); |
| 8 } catch (e) { |
| 9 result1 = e; |
| 10 } |
| 11 try { |
| 12 result2 = eval(str2); |
| 13 } catch (e) { |
| 14 result2 = e; |
| 15 } |
| 16 if (result1 === result2) |
| 17 document.body.innerHTML += str1 + " === " + str2 + " <span style='color:gree
n; font-weight:bold'>PASS</span><br>"; |
| 18 else |
| 19 document.body.innerHTML += str1 + " was not " + str2 + ". The left hand side
was [" + result1 + "] and the right hand side was [" + result2 + "]. <span styl
e='color:red; font-weight:bold'>FAIL</span><br>"; |
| 20 } |
| 21 |
| 22 function shouldThrow(str) { |
| 23 var result; |
| 24 var thrown = false; |
| 25 try { |
| 26 result = eval(str); |
| 27 } catch (e) { |
| 28 thrown = true; |
| 29 result = e; |
| 30 } |
| 31 if (thrown === true) |
| 32 document.body.innerHTML += str + " threw [" + result + "]. <span style='colo
r:green; font-weight:bold'>PASS</span><br>"; |
| 33 else |
| 34 document.body.innerHTML += str + " did not throw. The result was [" + result
+ "]. <span style='color:red; font-weight:bold'>FAIL</span><br>"; |
| 35 } |
| 36 |
| 37 function log(str) { |
| 38 document.body.innerHTML += str + "<br>"; |
| 39 } |
| 40 |
| 41 function run(title, repeatNum, func, rounds) { |
| 42 var result = document.getElementById("result"); |
| 43 if (!result) { |
| 44 var result = document.createElement("div"); |
| 45 document.body.appendChild(result); |
| 46 } |
| 47 |
| 48 var rounds = rounds || 5; |
| 49 var times = []; |
| 50 for (var r = 0; r < rounds; r++) { |
| 51 var start = Date.now(); |
| 52 func(repeatNum); |
| 53 var time = Date.now() - start; |
| 54 times.push(time * 1e6 / repeatNum); |
| 55 //result.appendChild(document.createTextNode(time)); |
| 56 //result.appendChild(document.createElement("br")); |
| 57 } |
| 58 |
| 59 times.sort(function (a, b) { return a - b; }); |
| 60 var median = times[Math.floor(times.length / 2)]; |
| 61 var min = times[0]; |
| 62 var max = times[times.length - 1]; |
| 63 var sum = 0; |
| 64 var sum2 = 0; |
| 65 for (var i = 0; i < times.length; i++) { |
| 66 sum += times[i]; |
| 67 sum2 += times[i] * times[i]; |
| 68 } |
| 69 var avg = sum / rounds; |
| 70 var avgTotal = avg * repeatNum / 1e6; |
| 71 var stdev = Math.sqrt(sum2 / rounds - avg * avg); |
| 72 |
| 73 result.appendChild(document.createTextNode(title + " : mean=" + avg.toFixed(2)
+ "ns, min=" + min + "ns, median=" + median + "ns, max=" + max + "ns, stdev=" +
stdev.toFixed(2) + "ns, total=" + avgTotal.toFixed(2) + "ms")); |
| 74 result.appendChild(document.createElement("br")); |
| 75 } |
| 76 </script> |
| 77 </head> |
| 78 <body> |
| 79 <script> |
| 80 function checkCorrectness() { |
| 81 div = document.createElement("div"); |
| 82 shouldBe('div.hasOwnProperty("testAttrOnHTMLDivElement")', "true"); |
| 83 shouldBe('div.hasOwnProperty("testAttrOnHTMLElement")', "true"); |
| 84 shouldBe('div.hasOwnProperty("testAttrOnElement")', "true"); |
| 85 shouldBe('div.hasOwnProperty("testAttrOnNode")', "true"); |
| 86 shouldBe('div.__proto__.hasOwnProperty("testAttrOnHTMLDivElementWithGetterAndS
etter")', "true"); |
| 87 shouldBe('div.__proto__.__proto__.hasOwnProperty("testAttrOnHTMLElementWithGet
terAndSetter")', "true"); |
| 88 shouldBe('div.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnElementW
ithGetterAndSetter")', "true"); |
| 89 shouldBe('div.__proto__.__proto__.__proto__.__proto__.hasOwnProperty("testAttr
OnNodeWithGetterAndSetter")', "true"); |
| 90 shouldBe('div.__proto__.hasOwnProperty("testAttrOnHTMLDivElementWithGetterAndS
etterExpected")', "true"); |
| 91 shouldBe('div.__proto__.__proto__.hasOwnProperty("testAttrOnHTMLElementWithGet
terAndSetterExpected")', "true"); |
| 92 shouldBe('div.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnElementW
ithGetterAndSetterExpected")', "true"); |
| 93 shouldBe('div.__proto__.__proto__.__proto__.__proto__.hasOwnProperty("testAttr
OnNodeWithGetterAndSetterExpected")', "true"); |
| 94 shouldBe('xhr = new XMLHttpRequest(); xhr.__proto__ = HTMLDivElement.prototype
; xhr.testAttrOnHTMLDivElement', "undefined"); |
| 95 /* |
| 96 shouldThrow('xhr = new XMLHttpRequest(); xhr.__proto__ = HTMLDivElement.protot
ype; xhr.testAttrOnHTMLDivElementWithGetterAndSetter'); |
| 97 shouldThrow('obj = Object.create(div); obj.testAttrOnHTMLDivElement'); |
| 98 shouldThrow('obj = Object.create(div); obj.testAttrOnHTMLDivElementWithGetterA
ndSetter'); |
| 99 */ |
| 100 } |
| 101 |
| 102 checkCorrectness(); |
| 103 |
| 104 Object.defineProperty(HTMLDivElement.prototype, "testAttrOnHTMLDivElementWithGet
terAndSetterExpected", { |
| 105 get: function() { return this.testAttrOnHTMLDivElement; }, |
| 106 set: function(v) { this.testAttrOnHTMLDivElement = v; } }); |
| 107 Object.defineProperty(HTMLElement.prototype, "testAttrOnHTMLElementWithGetterAnd
SetterExpected", { |
| 108 get: function() { return this.testAttrOnHTMLElement; }, |
| 109 set: function(v) { this.testAttrOnHTMLElement = v; } }); |
| 110 Object.defineProperty(Element.prototype, "testAttrOnElementWithGetterAndSetterEx
pected", { |
| 111 get: function() { return this.testAttrOnElement; }, |
| 112 set: function(v) { this.testAttrOnElement = v; } }); |
| 113 Object.defineProperty(Node.prototype, "testAttrOnNodeWithGetterAndSetterExpected
", { |
| 114 get: function() { return this.testAttrOnNode; }, |
| 115 set: function(v) { this.testAttrOnNode = v; } }); |
| 116 |
| 117 var repeatNum1 = 20000000; |
| 118 var repeatNum2 = 10000000; |
| 119 var rounds = 10; |
| 120 |
| 121 var div = document.createElement("div"); |
| 122 |
| 123 log(""); |
| 124 |
| 125 run("div.testAttrOnHTMLDivElement getter", repeatNum1, function(repeatNum) { |
| 126 var div = document.createElement("div"); |
| 127 for (var j = 0; j < repeatNum; j++) { |
| 128 div.testAttrOnHTMLDivElement; |
| 129 } |
| 130 }, rounds); |
| 131 |
| 132 run("div.testAttrOnHTMLElement getter", repeatNum1, function(repeatNum) { |
| 133 var div = document.createElement("div"); |
| 134 for (var j = 0; j < repeatNum; j++) { |
| 135 div.testAttrOnHTMLElement; |
| 136 } |
| 137 }, rounds); |
| 138 |
| 139 run("div.testAttrOnElement getter", repeatNum1, function(repeatNum) { |
| 140 var div = document.createElement("div"); |
| 141 for (var j = 0; j < repeatNum; j++) { |
| 142 div.testAttrOnElement; |
| 143 } |
| 144 }, rounds); |
| 145 |
| 146 run("div.testAttrOnNode getter", repeatNum1, function(repeatNum) { |
| 147 var div = document.createElement("div"); |
| 148 for (var j = 0; j < repeatNum; j++) { |
| 149 div.testAttrOnNode; |
| 150 } |
| 151 }, rounds); |
| 152 |
| 153 run("div.testAttrOnHTMLDivElementWithGetterAndSetter getter", repeatNum1, functi
on(repeatNum) { |
| 154 var div = document.createElement("div"); |
| 155 for (var j = 0; j < repeatNum; j++) { |
| 156 div.testAttrOnHTMLDivElementWithGetterAndSetter; |
| 157 } |
| 158 }, rounds); |
| 159 |
| 160 run("div.testAttrOnHTMLElementWithGetterAndSetter getter", repeatNum1, function(
repeatNum) { |
| 161 var div = document.createElement("div"); |
| 162 for (var j = 0; j < repeatNum; j++) { |
| 163 div.testAttrOnHTMLElementWithGetterAndSetter; |
| 164 } |
| 165 }, rounds); |
| 166 |
| 167 run("div.testAttrOnElementWithGetterAndSetter getter", repeatNum1, function(repe
atNum) { |
| 168 var div = document.createElement("div"); |
| 169 for (var j = 0; j < repeatNum; j++) { |
| 170 div.testAttrOnElementWithGetterAndSetter; |
| 171 } |
| 172 }, rounds); |
| 173 |
| 174 run("div.testAttrOnNodeWithGetterAndSetter getter", repeatNum1, function(repeatN
um) { |
| 175 var div = document.createElement("div"); |
| 176 for (var j = 0; j < repeatNum; j++) { |
| 177 div.testAttrOnNodeWithGetterAndSetter; |
| 178 } |
| 179 }, rounds); |
| 180 |
| 181 run("div.testAttrOnHTMLDivElementWithGetterAndSetterExpected getter", repeatNum1
, function(repeatNum) { |
| 182 var div = document.createElement("div"); |
| 183 for (var j = 0; j < repeatNum; j++) { |
| 184 div.testAttrOnHTMLDivElementWithGetterAndSetterExpected; |
| 185 } |
| 186 }, rounds); |
| 187 |
| 188 run("div.testAttrOnHTMLElementWithGetterAndSetterExpected getter", repeatNum1, f
unction(repeatNum) { |
| 189 var div = document.createElement("div"); |
| 190 for (var j = 0; j < repeatNum; j++) { |
| 191 div.testAttrOnHTMLElementWithGetterAndSetterExpected; |
| 192 } |
| 193 }, rounds); |
| 194 |
| 195 run("div.testAttrOnElementWithGetterAndSetterExpected getter", repeatNum1, funct
ion(repeatNum) { |
| 196 var div = document.createElement("div"); |
| 197 for (var j = 0; j < repeatNum; j++) { |
| 198 div.testAttrOnElementWithGetterAndSetterExpected; |
| 199 } |
| 200 }, rounds); |
| 201 |
| 202 run("div.testAttrOnNodeWithGetterAndSetterExpected getter", repeatNum1, function
(repeatNum) { |
| 203 var div = document.createElement("div"); |
| 204 for (var j = 0; j < repeatNum; j++) { |
| 205 div.testAttrOnNodeWithGetterAndSetterExpected; |
| 206 } |
| 207 }, rounds); |
| 208 |
| 209 log(""); |
| 210 |
| 211 run("div.testAttrOnHTMLDivElement setter", repeatNum2, function(repeatNum) { |
| 212 var div = document.createElement("div"); |
| 213 for (var j = 0; j < repeatNum; j++) { |
| 214 div.testAttrOnHTMLDivElement = ""; |
| 215 } |
| 216 }, rounds); |
| 217 |
| 218 run("div.testAttrOnHTMLElement setter", repeatNum2, function(repeatNum) { |
| 219 var div = document.createElement("div"); |
| 220 for (var j = 0; j < repeatNum; j++) { |
| 221 div.testAttrOnHTMLElement = ""; |
| 222 } |
| 223 }, rounds); |
| 224 |
| 225 run("div.testAttrOnElement setter", repeatNum2, function(repeatNum) { |
| 226 var div = document.createElement("div"); |
| 227 for (var j = 0; j < repeatNum; j++) { |
| 228 div.testAttrOnElement = ""; |
| 229 } |
| 230 }, rounds); |
| 231 |
| 232 run("div.testAttrOnNode setter", repeatNum2, function(repeatNum) { |
| 233 var div = document.createElement("div"); |
| 234 for (var j = 0; j < repeatNum; j++) { |
| 235 div.testAttrOnNode = ""; |
| 236 } |
| 237 }, rounds); |
| 238 |
| 239 run("div.testAttrOnHTMLDivElementWithGetterAndSetter setter", repeatNum2, functi
on(repeatNum) { |
| 240 var div = document.createElement("div"); |
| 241 for (var j = 0; j < repeatNum; j++) { |
| 242 div.testAttrOnHTMLDivElementWithGetterAndSetter = ""; |
| 243 } |
| 244 }, rounds); |
| 245 |
| 246 run("div.testAttrOnHTMLElementWithGetterAndSetter setter", repeatNum2, function(
repeatNum) { |
| 247 var div = document.createElement("div"); |
| 248 for (var j = 0; j < repeatNum; j++) { |
| 249 div.testAttrOnHTMLElementWithGetterAndSetter = ""; |
| 250 } |
| 251 }, rounds); |
| 252 |
| 253 run("div.testAttrOnElementWithGetterAndSetter setter", repeatNum2, function(repe
atNum) { |
| 254 var div = document.createElement("div"); |
| 255 for (var j = 0; j < repeatNum; j++) { |
| 256 div.testAttrOnElementWithGetterAndSetter = ""; |
| 257 } |
| 258 }, rounds); |
| 259 |
| 260 run("div.testAttrOnNodeWithGetterAndSetter setter", repeatNum2, function(repeatN
um) { |
| 261 var div = document.createElement("div"); |
| 262 for (var j = 0; j < repeatNum; j++) { |
| 263 div.testAttrOnNodeWithGetterAndSetter = ""; |
| 264 } |
| 265 }, rounds); |
| 266 |
| 267 run("div.testAttrOnHTMLDivElementWithGetterAndSetterExpected setter", repeatNum2
, function(repeatNum) { |
| 268 var div = document.createElement("div"); |
| 269 for (var j = 0; j < repeatNum; j++) { |
| 270 div.testAttrOnHTMLDivElementWithGetterAndSetterExpected = ""; |
| 271 } |
| 272 }, rounds); |
| 273 |
| 274 run("div.testAttrOnHTMLElementWithGetterAndSetterExpected setter", repeatNum2, f
unction(repeatNum) { |
| 275 var div = document.createElement("div"); |
| 276 for (var j = 0; j < repeatNum; j++) { |
| 277 div.testAttrOnHTMLElementWithGetterAndSetterExpected = ""; |
| 278 } |
| 279 }, rounds); |
| 280 |
| 281 run("div.testAttrOnElementWithGetterAndSetterExpected setter", repeatNum2, funct
ion(repeatNum) { |
| 282 var div = document.createElement("div"); |
| 283 for (var j = 0; j < repeatNum; j++) { |
| 284 div.testAttrOnElementWithGetterAndSetterExpected = ""; |
| 285 } |
| 286 }, rounds); |
| 287 |
| 288 run("div.testAttrOnNodeWithGetterAndSetterExpected setter", repeatNum2, function
(repeatNum) { |
| 289 var div = document.createElement("div"); |
| 290 for (var j = 0; j < repeatNum; j++) { |
| 291 div.testAttrOnNodeWithGetterAndSetterExpected = ""; |
| 292 } |
| 293 }, rounds); |
| 294 |
| 295 log(""); |
| 296 </script> |
| 297 </body> |
| 298 </html> |
OLD | NEW |