Sounds like a potential JS engine optimization, rather than a language feature 
per se.


> On May 12, 2016, at 1:53 PM, Brian Barnes <[email protected]> wrote:
> 
> Not by my testing, at least.
> 
> My original example is a simple one to explain what the procedure is.  Here’s 
> a more complex example, from my code, from my mesh classes.  This function 
> updates the vertices in the mesh based on the position of the bones of a 
> skeleton, it gets called every frame for every model mesh that can be seen in 
> the scene:
> 
>    updateVertexesToPoseAndPosition(view,skeleton,angle,position)
>    {
>        var n,v;
>        var bone,parentBone;
> 
>            // move all the vertexes
> 
>        var vIdx=0;
>        var nIdx=0;
> 
>        for (n=0;n!==this.vertexCount;n++) {
>            v=this.vertexList[n];
> 
>                // bone movement
> 
>            bone=skeleton.bones[v.boneIdx];
> 
>            this.rotVector.setFromPoint(v.vectorFromBone);
>            this.rotVector.rotate(bone.curPoseAngle);
> 
>            this.rotVector.x=bone.curPosePosition.x+this.rotVector.x;
>            this.rotVector.y=bone.curPosePosition.y+this.rotVector.y;
>            this.rotVector.z=bone.curPosePosition.z+this.rotVector.z;
> 
>            this.rotNormal.setFromPoint(v.normal);
>            this.rotNormal.rotate(bone.curPoseAngle);
> 
>                // average in any parent movement
> 
>            if (v.parentBoneIdx!==-1) {
>                parentBone=skeleton.bones[v.parentBoneIdx];
> 
>                this.parentRotVector.setFromPoint(v.vectorFromParentBone);
>                this.parentRotVector.rotate(parentBone.curPoseAngle);
> 
>                
> this.parentRotVector.x=parentBone.curPosePosition.x+this.parentRotVector.x;
>                
> this.parentRotVector.y=parentBone.curPosePosition.y+this.parentRotVector.y;
>                
> this.parentRotVector.z=parentBone.curPosePosition.z+this.parentRotVector.z;
> 
>                this.parentRotNormal.setFromPoint(v.normal);
>                this.parentRotNormal.rotate(parentBone.curPoseAngle);
> 
>                this.rotVector.average(this.parentRotVector);
>                this.rotNormal.average(this.parentRotNormal);
>            }    
> 
>                // whole model movement
> 
>            this.rotVector.rotate(angle);
> 
>            this.drawVertices[vIdx++]=this.rotVector.x+position.x;
>            this.drawVertices[vIdx++]=this.rotVector.y+position.y;
>            this.drawVertices[vIdx++]=this.rotVector.z+position.z;
> 
>            this.rotNormal.rotate(angle);
> 
>            this.drawNormals[nIdx++]=this.rotNormal.x;
>            this.drawNormals[nIdx++]=this.rotNormal.y;
>            this.drawNormals[nIdx++]=this.rotNormal.z;
>        }
> 
>            // set the buffers
> 
>        var gl=view.gl;
>        gl.bindBuffer(gl.ARRAY_BUFFER,this.vertexPosBuffer);
>        gl.bufferData(gl.ARRAY_BUFFER,this.drawVertices,gl.DYNAMIC_DRAW);
> 
>        gl.bindBuffer(gl.ARRAY_BUFFER,this.vertexNormalBuffer);
>        gl.bufferData(gl.ARRAY_BUFFER,this.drawNormals,gl.STATIC_DRAW);
>    }
> 
> Notice that rotVector, rotNormal, parentRotVector, and parentRotNormal, are 
> all “this”, i.e., globals.  They are *only* used in this function, no where 
> else in the class.  If I put them as local variables, I get enormous GC 
> pauses.  If I don’t, I get none (granted, I have to do this everywhere, so 
> it’s just not this function.)
> 
> The example I gave existed only to show how it would work; not a real 
> example.  Here’s a real example, that shows obvious problems with local 
> variables.  Yes, these are objects.
> 
> Not that moving the objects would ONLY be something that happened at compile 
> time and would be a hint; they wouldn’t be effected in the warm up runs.  
> You’d almost have to say that same hint would force a compile (which has it’s 
> own problems.)
> 
> [>] Brian
> 
>> On May 12, 2016, at 1:33 PM, Allen Wirfs-Brock <[email protected]> wrote:
>> 
>> 
>>> On May 12, 2016, at 9:39 AM, Brian Barnes <[email protected]> wrote:
>>> 
>>> ...
>>> If I call doSomething a lot of times, I get a lot of objects to be tracked 
>>> and GC’d.  Yes, I can rewrite that code to obviously eliminate them, but 
>>> pretend there is actually something interesting happening here that 
>>> requires those variables.  And engines can be smart enough to mark them and 
>>> deal with them with the function ends (I don’t know if this is done.)
>>> 
>>> What I’m thinking is some kind of class based hint that would “super” hoist 
>>> all local function variables.  It would be sugar but it would transform it 
>>> into:
>>> 
>> 
>> 
>> 
>> Local variables like a,b,c in your example are probably the least expensive 
>> construct in JS. In your example, there are no objects created by 
>> doSomething, not state that persists after doSomething  returns, and no GC 
>> pressure. Anything you do WRT moving such local state into object properties 
>> is going to be more expensive.
>> 
>> Allen
>> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to