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.pier...@mozilla.com> wrote: > Hi Robert, > > On Thu, Jun 22, 2017 at 6:02 PM, Robert Poor <rdp...@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 <rdp...@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 >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss