Interesting. Good to know. Here’s what I got: function timeJoin(){ var start = new Date(); var i=-1; var len = 10000000; var arr = []; while(++i<len) { arr[i] = "a"; } var str = arr.join(""); var end = new Date(); console.log(end.getTime()-start.getTime()); }; function timePush(){ var start = new Date(); var i=-1; var len = 10000000; var arr = []; while(++i<len) { arr.push("a"); } var str = arr.join(""); var end = new Date(); console.log(end.getTime()-start.getTime()); };
Chrome: timeJoin() 822 timePush() 979 Firefox: timeJoin() 184 timePush() 303 Not what I’d call “terrible” (at least for short strings), but indexed assignment is definitely faster. On Jul 26, 2016, at 8:28 PM, Josh Tynjala <joshtynj...@gmail.com> wrote: > Yeah, push() is terribly bad for performance because of the GC overhead > from the ...rest Array. In Starling and Feathers, we always try to avoid > push() whenever possible. We usually use bracket syntax instead: > > array[array.length] = newValue; > > In loops, it's possible to use a local integer counter instead of checking > the length property every time. > > counter = 0; //or counter = array.length, if it isn't empty > for(...) > { > array[counter] = newValue; > counter++; > } > > - Josh > > > On Tue, Jul 26, 2016 at 10:15 AM, Alex Harui <aha...@adobe.com> wrote: > >> >> >> On 7/26/16, 1:40 AM, "Harbs" <harbs.li...@gmail.com> wrote: >> >>> I noticed a couple of things: >>> 1. There’s lots of String(val) casts in FlexJS code. This practice is >>> considered “bad” practice in Javascript where implicit conversion is >>> generally quicker. So in a case where a number can be converted >>> implicitly, the cast should be completely skipped and even when a number >>> needs to be converted to a string, “” + val is more efficient than >>> String(val). This is especially true in FlexJS where (I believe) such >>> code will result in org.apache.flex.Language.as(val,”String”). >> >> I'm not seeing this. What source code is generating String(val) calls? >> Regarding optimization, do we know if GCC will do this ("" + val) >> optimization for us? >> >> In general, there is a big TODO around type conversions. >> >>> >>> 2. String concatenation: I’m not sure how much of an issue this is in >>> current browsers, but using aray.join() to build a string was MUCH faster >>> than building strings using the plus operator. For longer strings the >>> difference was dramatic. >> >> If I understood this, it would be hard for the compiler to generate the >> right code for all browsers. You could create a StringBuilder class that >> checks platforms and runs different code at runtime. >> >> FWIW, Flex UIDUtils uses ByteArray because, IIRC, while array.join() might >> be fast, the array.push() is horribly slow and generates a lot of GC >> activity. >> >> HTH, >> -Alex >> >>