Math.sincos(x)?
Robert Poor
rdpoor at gmail.com
Fri Jun 23 10:38:18 UTC 2017
I previously wrote:
>> most implementations for cos(theta) actually generate sin(theta) as a
"byproduct"
As others several have pointed out, that's not really true. V8, for
example, uses a (different) Taylor series approximation for sin and cos.
But given the amount of work that goes into reducing theta to a small
interval, it still might make sense. (See comment about SpiderMonkey
below...)
@Nicolas:
> SpiderMonkey already try to optimize consecutive calls to cos and sin
Very cool!
> `return { sin: sin(theta), cos: cos(theta) };` will add pressure to the
nursery of the garbage collector.
True -- forgive my ignorance, but is there a way to return multiple values
that does not cause heap allocation? That was my intention.
Another possible optimization: cache theta with its interval-reduced
equivalent. If you get a subsequent call with the same theta, you've
already done half the work.
On Fri, Jun 23, 2017 at 3:00 AM, Nicolas B. Pierron <
nicolas.b.pierron at mozilla.com> wrote:
> Hi Robert,
>
> On Thu, Jun 22, 2017 at 6:02 PM, Robert Poor <rdpoor at gmail.com> wrote:
> > How often have you seen code that calls Math.sin() and Math.cos() with
> > the same argument, e.g:
> >
> > x = r * Math.cos(theta);
> > y = r * Math.sin(theta);
> >
> > ? This trope is repeated for polar coordinates, complex arithmetic,
> FTTs, etc.
> >
> > However, most implementations for cos(theta) actually generate
> > sin(theta) as a "byproduct" (and vice-versa). Since trigonometric
> > functions are relatively expensive, and this is a common pattern,
> > wouldn't it make sense to define a function that returns cos(theta)
> > and sin(theta) at the same time?
>
> For your information, the optimizing compiler of SpiderMonkey already
> try to optimize consecutive calls to cos and sin by the sincos
> function when possible.
> I do not know if other optimizing compilers are doing this
> optimization as well, but I would expect that it would be quite easy
> to add.
>
> http://searchfox.org/mozilla-central/rev/3291398f10dcbe192fb52e74974b17
> 2616c018aa/js/src/jit/Ion.cpp#1310
>
> On Thu, Jun 22, 2017 at 6:02 PM, Robert Poor <rdpoor at gmail.com> wrote:
> > A polyfill might look like this:
> >
> > function sincos(theta) {
> > return { sin: sin(theta), cos: cos(theta) };
> > }
>
> I would expect all engines to use escape analysis to remove this
> object allocation, when this function is inlined.
>
> Until this code gets inlined, by allocating an object this code will
> add pressure to the nursery of the garbage collector. This will also
> add memory writes/reads to/from memory. Both are not desirable when
> you are doing math-intensive operations.
>
> --
> Nicolas B. Pierron
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20170623/8508c106/attachment.html>
More information about the es-discuss
mailing list