On Mon, Sep 1, 2014 at 9:12 AM, Vyacheslav Egorov <vego...@chromium.org> wrote:
>> Array#[push|pop]() is easily optimized for array instances, because
>> they each compile down to a single common assembly instruction
>
> Last time I checked Intel manual it did not have jsapop/jsapush
> instructions.
>
> You need to do a bit of checks (length underflow, lack holes in the array,
> etc). So a single instruction is unlikely (though potentially possible in a
> loop under certain conditions --- but those conditions require sophisticated
> optimizations to achieve, e.g. you need to hoist bounds checks and sink
> update of length out of the loop, etc.).

I'll recind that statement. It still is easily optimizable to a low
level. An array of numbers can
be compiled eventually to push/pop (pushf/popf for floats).

>
>> but to make a special case (or more optimal case) for Arrays in
>> Array#join(), and especially if it is an array of Strings.
>
> There is such case. It's called _FastAsciiArrayJoin.

Is there a reason why the special case is faster in JS than native
(even taking into account coercion)?

>
>> This is a relatively fast snippet of C++ code:
>
> This might have O(n^2) runtime complexity or waste memory for result (if
> library does capacity doubling on appends, which is common strategy)
> depending on how your C++ library reserves capacity for std::string.
>
> std::string join(const std::vector<std::string>& array) {
>   size_t total_length = 0;
>   for (auto& s : array) total_length += s.length();
>
>   std::string str;
>   str.reserve(total_length);
>   for (auto& s : array) str.append(s);
>   return str;
> }

Amend that to "simple". I'm not usually coding in C++.

>
> which is btw exactly what _FastAsciiArrayJoin attempts to do.
>
>
>
>
> Vyacheslav Egorov
>
>
> On Mon, Sep 1, 2014 at 11:20 AM, Isiah Meadows <impinb...@gmail.com> wrote:
>>
>> That library rarely does type checking. This contributes a lot of
>> speed to their overall algorithm. If you look at my benchmarks,
>> clearly, removing type checking helps, but it doesn't help for all
>> applications. Another thing is that they use 99% C-style for loops
>> with numerical indices instead of for-in loops (which always require
>> some type checking because they work with all Objects and Arrays). The
>> code actually resembles Asm.js in its heavy use of numbers.
>>
>> Array#[push|pop]() is easily optimized for array instances, because
>> they each compile down to a single common assembly instruction. Also,
>> in the case of Array#pop(), if the value isn't used, then it can
>> simply pop to the same register over and over again, making it easily
>> surpass 100 million operations per second if properly optimized.
>>
>> Back to the initial topic, my main request isn't to remove
>> type-checking, but to make a special case (or more optimal case) for
>> Arrays in Array#join(), and especially if it is an array of Strings.
>> This is a relatively fast snippet of C++ code:
>>
>> std::string join(std::string* array, int len) {
>>   std::string str = '';
>>   while (len) {
>>     str += *(array + --len);
>>   }
>>   return str;
>> }
>>
>> The Fast library could speed up some of their methods easily by
>> reversing the iteration order for some methods (and I'm about to draft
>> a quick patch to it).
>>
>> On Sun, Aug 31, 2014 at 9:22 AM, Jacob G <kurtext...@gmail.com> wrote:
>> > You should take a look at this too: https://github.com/codemix/fast.js -
>> > Functions written in JS are faster than the native functions. Is there
>> > something to be done?
>> >
>> > Am Sonntag, 31. August 2014 02:16:37 UTC+2 schrieb Isiah Meadows:
>> >>
>> >> I profiled various native methods, comparing them to equivalent
>> >> polyfills
>> >> and special-cased ones. I compared the following functions:
>> >>
>> >> Math.abs(x)
>> >> Array.prototype.pop()
>> >> Math.ceil(x)
>> >> Array.prototype.join(sep)
>> >>
>> >> I found the following things from testing in various browsers:
>> >>
>> >> Math.abs(x)
>> >>
>> >> Webkit is about twice as fast as V8 in the native implementation.
>> >> Webkit's performance in the rest is on par with V8's.
>> >> Similar performance between type-ignorant polyfills and native
>> >> implementation (on all browsers)
>> >>
>> >> Array.prototype.pop()
>> >>
>> >> Firefox clearly hasn't optimized the special case for arrays natively.
>> >> JS polyfills are insanely slow, with type checking making little
>> >> difference.
>> >>
>> >> Math.ceil(x)
>> >>
>> >> JS polyfills significantly slower, but that is explainable with the
>> >> better
>> >> bitwise ability with floats/doubles/etc. in C/C++.
>> >>
>> >> Mine does it without branching, but a potentially better way is to
>> >> decrement if less than 0 and truncate it.
>> >>
>> >> Webkit is a little faster, but not a lot.
>> >>
>> >> Array.prototype.join(sep)
>> >>
>> >> JS standards polyfill rather slow
>> >> JS polyfill assuming an array is over twice as fast as the native
>> >> implementation (If it optimizes for this case, it should structurally
>> >> resemble a Java Object[] internally).
>> >>
>> >> This really needs a special case (or better special case) for Arrays.
>> >>
>> >> I can't a patch for this yet, because of current CLA confusion
>> >> (off-topic), but it should be relatively simple.
>> >
>> > --
>> > --
>> > v8-users mailing list
>> > v8-users@googlegroups.com
>> > http://groups.google.com/group/v8-users
>> > ---
>> > You received this message because you are subscribed to a topic in the
>> > Google Groups "v8-users" group.
>> > To unsubscribe from this topic, visit
>> > https://groups.google.com/d/topic/v8-users/FoK9X52cIDs/unsubscribe.
>> > To unsubscribe from this group and all its topics, send an email to
>> > v8-users+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>>
>>
>>
>> --
>> Isiah Meadows
>>
>> --
>> --
>> v8-users mailing list
>> v8-users@googlegroups.com
>> http://groups.google.com/group/v8-users
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "v8-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to v8-users+unsubscr...@googlegroups.com.
>>
>> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "v8-users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/v8-users/FoK9X52cIDs/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> v8-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



-- 
Isiah Meadows

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to