这种分配对速度有影响吗?
Does this allocation have any effects on speed?
此非成员函数 drawPoly()
从顶点列表中绘制 3D space 的 n 边多边形。
此函数在正常执行期间通常会被调用数千次,速度至关重要。
忽略 drawPoly()
中调用的函数的影响,25 元素顶点数组的分配对速度有任何负面影响吗?
void drawPoly(const meshx::Face& face, gen::Vector position,
ALLEGRO_COLOR color, bool filled)
{
ALLEGRO_VERTEX vertList[25];
std::size_t k = 0;
// ...For every vertex in the polygon...
for(; k < face.getNumVerts(); ++k) {
vertList[k].x = position.x + face.alVerts[k].x;
vertList[k].y = position.y + face.alVerts[k].y;
vertList[k].z = position.z + face.alVerts[k].z;
vertList[k].u = 0;
vertList[k].v = 0;
vertList[k].color = color;
}
// Draw with ALLEGRO_VERTEXs and no textures.
if(filled) {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_TRIANGLE_LIST);
} else {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_LINE_LOOP);
}
}
唯一能确定的方法就是测量。但是你还能用什么来比较呢?在堆上分配显然会更慢。使用全局变量来保存顶点可能是一种选择 - 仅用于性能基准测试。
鉴于普通可构造对象的堆栈分配通常转化为堆栈指针的简单更改,分配本身可能没什么大不了的。可能会产生明显影响的是触及额外的缓存行。从性能的角度来看,代码写入的缓存行越少越好。因此,您可以尝试将 vertList[25]
拆分为缓存行大小的数组,并多次调用 al_draw_prim
。基准会显示是否存在差异。
此非成员函数 drawPoly()
从顶点列表中绘制 3D space 的 n 边多边形。
此函数在正常执行期间通常会被调用数千次,速度至关重要。
忽略 drawPoly()
中调用的函数的影响,25 元素顶点数组的分配对速度有任何负面影响吗?
void drawPoly(const meshx::Face& face, gen::Vector position,
ALLEGRO_COLOR color, bool filled)
{
ALLEGRO_VERTEX vertList[25];
std::size_t k = 0;
// ...For every vertex in the polygon...
for(; k < face.getNumVerts(); ++k) {
vertList[k].x = position.x + face.alVerts[k].x;
vertList[k].y = position.y + face.alVerts[k].y;
vertList[k].z = position.z + face.alVerts[k].z;
vertList[k].u = 0;
vertList[k].v = 0;
vertList[k].color = color;
}
// Draw with ALLEGRO_VERTEXs and no textures.
if(filled) {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_TRIANGLE_LIST);
} else {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_LINE_LOOP);
}
}
唯一能确定的方法就是测量。但是你还能用什么来比较呢?在堆上分配显然会更慢。使用全局变量来保存顶点可能是一种选择 - 仅用于性能基准测试。
鉴于普通可构造对象的堆栈分配通常转化为堆栈指针的简单更改,分配本身可能没什么大不了的。可能会产生明显影响的是触及额外的缓存行。从性能的角度来看,代码写入的缓存行越少越好。因此,您可以尝试将 vertList[25]
拆分为缓存行大小的数组,并多次调用 al_draw_prim
。基准会显示是否存在差异。