{"push_id":1146637107,"size":11,"distinct_size":11,"ref":"refs/heads/master","head":"0b6be2a8df08cace4fc20e8d62c87b37b8e6fbc3","before":"a0a1cd753f5320af45651c47c2b1989829f9f40f","commits":[{"sha":"a4ebe5a866b48138440646ecd81b8ddb83c50d52","author":{"name":"Guillaume Grossetie","email":"265ec566f8a96939b1a39878557c2319ddc21c4f@gmail.com"},"message":"Implement IO.read & IO.each_line method on Node.js (#1348)\n\nResolves #1332 \r\nResolves #1221","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/a4ebe5a866b48138440646ecd81b8ddb83c50d52"},{"sha":"f0f7e1dbe12f1e2463150d4fb8370400f837a4ff","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Marks methods as pristine from corelib\n\nThis allows to make certain assumptions and possibly provide a native\nimplementation instead of going through the complete call process.","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/f0f7e1dbe12f1e2463150d4fb8370400f837a4ff"},{"sha":"d5c12cfb657c1ba85145c7bcf8d8a0ee3576a08a","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Use Opal.pristine to improve Array#dup performance\n\nFixes #1459","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/d5c12cfb657c1ba85145c7bcf8d8a0ee3576a08a"},{"sha":"5a9fabed4d556e4769c4a256f4d72e53c30ee417","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Merge pull request #1472 from opal/elia/pristine-methods-support\n\nAllow methods to be marked as pristine from corelib","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/5a9fabed4d556e4769c4a256f4d72e53c30ee417"},{"sha":"9380d3bf9390f62a96b724bbf66d3e39481d25c5","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Improve code readability in `def` node","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/9380d3bf9390f62a96b724bbf66d3e39481d25c5"},{"sha":"86f88100ed9936149d03a37f69c6a8901c0e4da7","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Bump beta version to 0.10.beta4","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/86f88100ed9936149d03a37f69c6a8901c0e4da7"},{"sha":"4b954ee2656b37baabb247b7ee1376e7a42447bb","author":{"name":"Elia Schito","email":"b3dcde1fe59cef651308381c6ae294ee635fcddf@schito.me"},"message":"Bump beta version to 0.10.beta5","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/4b954ee2656b37baabb247b7ee1376e7a42447bb"},{"sha":"ea5fae55266f81b0fbf9232edaadfc4376063605","author":{"name":"Guillaume Grossetie","email":"265ec566f8a96939b1a39878557c2319ddc21c4f@gmail.com"},"message":"generate opal-builder.js (#1292)\n\nResolves #1290","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/ea5fae55266f81b0fbf9232edaadfc4376063605"},{"sha":"a636e47a0cc8728c5b5fe67303a0ba14ae300542","author":{"name":"Guillaume Grossetie","email":"265ec566f8a96939b1a39878557c2319ddc21c4f@gmail.com"},"message":"Implement Pathname.entries & Dir.mkdir (Node.js) (#1408)\n\nResolves #1407","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/a636e47a0cc8728c5b5fe67303a0ba14ae300542"},{"sha":"d378f6b17950c5b6bc5f35cbb132e6f261a8346e","author":{"name":"Jamie Gaskins","email":"9dea4a7de988d26abe56ecdb3ff6e9cb26425ace@gmail.com"},"message":"Optimize Enumerable#count (#1473)\n\nOne of the most common uses of `Enumerable#count` is as an alias for `length` or `size`. Without a block or argument, we can short-circuit this to `size`. I also switched out the passing of `arguments` to `Opal.yieldX` so the function could be optimized.\r\n\r\nI broke some tests for what looks like the more obscure cases, so I'll need to check into that, but it seems to work for the more common cases.\r\n\r\nAll benchmarks are iterations/sec after a 100ms warmup. The array has 1000 elements. Higher results are better. I included `Array#size` to show the performance ceiling.\r\n\r\n### Safari 9.1.2\r\n\r\n#### Before\r\n\r\n```\r\narray.size\r\n  1779658\r\narray.count\r\n  4931\r\narray.count(1)\r\n  1958\r\narray.count(&:odd?)\r\n  480\r\narray.count { |i| i.odd? }\r\n  2042\r\n```\r\n\r\n#### After\r\n\r\n```\r\narray.size\r\n  1546681\r\narray.count\r\n  1471198\r\narray.count(1)\r\n  2873\r\narray.count(&:odd?)\r\n  464\r\narray.count { |i| i.odd? }\r\n  2572\r\n```\r\n\r\n### Chrome 51\r\n\r\n#### Before\r\n\r\n```\r\narray.size\r\n  3197569\r\narray.count\r\n  3905\r\narray.count(1)\r\n  2087\r\narray.count(&:odd?)\r\n  397\r\narray.count { |i| i.odd? }\r\n  1868\r\n```\r\n\r\n#### After\r\n\r\n```\r\narray.size\r\n  2191544\r\narray.count\r\n  2100559\r\narray.count(1)\r\n  3324\r\narray.count(&:odd?)\r\n  567\r\narray.count { |i| i.odd? }\r\n  3134\r\n```\r\n\r\n### Firefox 43\r\n\r\n#### Before\r\n\r\n```\r\n    array.size\r\n        1642654\r\n    array.count\r\n        1333\r\n    array.count(1)\r\n        693\r\n    array.count(&:odd?)\r\n        359\r\n    array.count { |i| i.odd? }\r\n        840\r\n```\r\n\r\n#### After\r\n\r\n```\r\n    array.size\r\n        1840939\r\n    array.count\r\n        1434968\r\n    array.count(1)\r\n        1929\r\n    array.count(&:odd?)\r\n        458\r\n    array.count { |i| i.odd? }\r\n        1933\r\n```\r\n\r\n---\r\n\r\nI noticed as I iterated on this that it started to resemble an idiomatic Ruby method post-compile, so I went ahead and ported it. No performance was lost.\r\n\r\nJS:\r\n![screen shot 2016-05-31 at 10 49 44 pm](https://cloud.githubusercontent.com/assets/108205/15696828/451cd2da-2782-11e6-9fb5-2ae0d04ce7be.png)\r\n\r\nRuby:\r\n![screen shot 2016-05-31 at 10 49 55 pm](https://cloud.githubusercontent.com/assets/108205/15696829/4a293426-2782-11e6-9c69-5fee634383c2.png)\r\n\r\nHigher iteration counts in a couple of those is due to longer dry runs to fully invoke the optimizer.\r\n\r\n---\r\n\r\nThe Journey:\r\n\r\n* Optimize Enumerable#count\r\n\r\n* Short-circuit Enumerable#count w/o block or arg\r\n\r\n* Only delegate to size for arrays\r\n\r\nI forgot, not all enumerables have a size method\r\n\r\n* Remove duck-typing check\r\n\r\nThis is directly on the array now. An array knows what it responds to\r\nalready.\r\n\r\n* Revert to defaulting to undefined\r\n\r\nnil is a perfectly acceptable value. I forgot.\r\n\r\n* Account for multiple args yielded to Enum#count\r\n\r\n* Convert Enumerable#count to Ruby\r\n\r\nThis should be fine and go just about as fast.\r\n\r\n* Fix destructuring and block calling\r\n\r\nTurns out `yieldX` is faster than `block.call`. Weird.","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/d378f6b17950c5b6bc5f35cbb132e6f261a8346e"},{"sha":"0b6be2a8df08cace4fc20e8d62c87b37b8e6fbc3","author":{"name":"Adam George","email":"e5b3d6fb757b3920b01033ebb9c2a63bae6260db@gmail.com"},"message":"Bringing fix from 0.9-stable that changes Native Hash initialize to check for null instead of undefined.","distinct":true,"url":"https://api.github.com/repos/adamcreekroad/opal/commits/0b6be2a8df08cace4fc20e8d62c87b37b8e6fbc3"}]}
{"actor":{"display_login":"adamcreekroad"}}