So I’m trying to optimize a function that is eating up 10% of my runtime shown here:
private var mRawData:Vector.<Number>;
//other private variables
/** Copies the vertex data (or a range of it, defined by 'vertexID' and 'numVertices')
* of this instance to another vertex data object, starting at a certain index.
*/
public function copyTo(targetData:VertexData, targetVertexID:int=0, vertexID:int=0, numVertices:int=-1):void
{
if (numVertices < 0 || vertexID + numVertices > mNumVertices)
numVertices = mNumVertices - vertexID;
// todo: check/convert pma
var targetRawData:Vector.<Number> = targetData.mRawData;
var targetIndex:int = targetVertexID * ELEMENTS_PER_VERTEX;
var sourceIndex:int = vertexID * ELEMENTS_PER_VERTEX;
var dataLength:int = numVertices * ELEMENTS_PER_VERTEX;
for (var i:int=sourceIndex; i<dataLength; ++i)
targetRawData[targetIndex++] = mRawData[i];
}
I figured that the largest impact must be the vector copying, from a start to end index. So I did some performance testing:
private function init(): void
{
var beforeTime:int;
var afterTime:int;
var i:int;
var j:int;
var REPS:int = 10;
var LENGTH:int = 100000;
var v:Vector.<Number> = new Vector.<Number>();
var v2:Vector.<Number> = new Vector.<Number>();
for (i = 0; i < LENGTH; ++i)
{
v[i] = i;
v2[i] = i;
}
row("Method", "Time");
beforeTime = getTimer();
for (i = 0; i < REPS; ++i)
{
v2 = v.slice(1000, LENGTH-1000);
}
afterTime = getTimer();
row("slice", (afterTime-beforeTime));
beforeTime = getTimer();
for (i = 0; i < REPS; ++i)
{
for (j = 1000; j < LENGTH-1000; ++j)
{
v2[j] = v[j];
}
}
afterTime = getTimer();
row("manual", (afterTime-beforeTime));
}
Does that performance test look correct? I’m getting really really weird results, saying that slice() is 10x faster than manual copying.
EDIT Hrm. I realize now that v2 will be different than V1 because slice will overwrite it.
That said, is there anyway to speed up the original function, specifically the loop at the end.