| //@ skip if $model == "Apple Watch Series 3" # added by mark-jsc-stress-test.py |
| // Test tryGetById's value profiling feedback without going too polymorphic. |
| |
| var createBuiltin = $vm.createBuiltin; |
| |
| var it = 1e5; |
| |
| const check = (got, expect) => { if (got != expect) throw "Error: bad result got " + got + " expected " + expect; }; |
| |
| const bench = f => { |
| // Re-create the builtin each time, so each benchmark gets its own value prediction. |
| const fooPlusBar = createBuiltin(`(function (o) { return @tryGetById(o, "foo") + @tryGetById(o, "bar"); })`); |
| noInline(fooPlusBar); |
| f(fooPlusBar); |
| } |
| noInline(bench); |
| |
| // Non bool int32. |
| o = { foo: 42, bar: 1337 }; |
| bench(builtin => { var res = 0; for (var i = 0; i < it; ++i) res += builtin(o); check(res, (o.foo + o.bar) * it); }); |
| |
| // Non int double. |
| p = { foo: Math.PI, bar: Math.E }; |
| bench(builtin => { var res = 0.; for (var i = 0; i < it; ++i) res += builtin(p); check(Math.round(res), Math.round((p.foo + p.bar) * it)); }); |
| |
| // String ident. |
| s = { foo: "", bar: "⌽" }; |
| bench(builtin => { var res = ""; for (var i = 0; i < it; ++i) res += builtin(s); check(res.length, (s.foo.length + s.bar.length) * it); }); |
| |
| // Again: non bool int32. |
| bench(builtin => { var res = 0; for (var i = 0; i < it; ++i) res += builtin(o); check(res, (o.foo + o.bar) * it); }); |