Потеря производительности на 8-10% при использовании векторов вместо динамических массивов - PullRequest
0 голосов
/ 08 ноября 2019

Я выяснил, что при выполнении моей программы при замене векторов на массивы происходит упомянутое различие в производительности.

Вот соответствующие фрагменты кода:

Vec3f* dist_ori = new Vec3f [n_triangles];
Vec3f* s2_ori = new Vec3f [n_triangles];
// std::vector<Vec3f> dist_ori;
// std::vector<Vec3f> s2_ori;

for (int i=0; i<n_triangles; i++) {
    dist_ori[i] = camera_origin - tri_arr[i].getVert1();
    s2_ori[i].cross(dist_ori[i], tri_arr[i].getVert2_edge1());
}


for (int i=0; i<n_triangles; i++) {
    dist_ori.push_back(camera_origin - triangle_container[i].getVert1());
    Vec3f tmp;
    tmp.cross(dist_ori[i], triangle_container[i].getVert2_edge1());
    s2_ori.push_back(tmp);
}

Здесь начинаетсяважный код внутри двух основных циклов (остальное больше помогло прояснить, что это за код)

for (int i=0; i<n_triangles; i++) {
     //if (triangle_container[i].intersect (camera_dir,camera_ori,dist_ori[i],s2_ori[i],triangle_container[i],t,u,v,x,y)) {
       if (tri_arr[i].intersect (camera_dir,camera_ori,/*edge1[i],edge2[i],*/dist_ori[i],s2_ori[i],tri_arr[i],t,u,v,x,y)) 
              object_index=i;
}

//Vec3f vert1 = triangle_container[object_index].getVert1 ();
//Vec3f vert2 = triangle_container[object_index].getVert2_edge1 () + vert1;
//Vec3f vert3 = triangle_container[object_index].getVert3_edge2() + vert1;
  Vec3f vert1 = tri_arr[object_index].getVert1 ();
  Vec3f vert2 = tri_arr[object_index].getVert2_edge1 () + vert1;
  Vec3f vert3 = tri_arr[object_index].getVert3_edge2() + vert1;
  Vec3f hit_normal = (1 - u - v) * vert1 + u * vert2 + v * vert3;
 //mat_type = triangle_container[object_index].getMaterialId ();
   mat_type = tri_arr [object_index].getMaterialId ();
 //normal = triangle_container[object_index].getNormal (x,y);
   normal = tri_arr [object_index].getNormal (x,y);

for (int j=0; j<n_triangles; j++) {
     //if (triangle_container[j].generateShadows (light_ray_dir,intersection,/*edge1[j],edge2[j],*/triangle_container[j],t,x,y)) {
     if (tri_arr[j].generateShadows (light_ray_dir,intersection,/*edge1[j],edge2[j],*/tri_arr[j],t,x,y)) {
        in_shadow = true;
        break;
     }
}

Во всяком случае, я тестировал оба кода в двух разных тестовых случаях, где я видел почти. Честно говоря, я вполне удовлетворен решением для работы с массивами, тем более что я уже написал код для него, тем не менее, для дальнейших случаев было бы неплохо узнать, есть ли способ предотвратить это. Плюс мне любопытно узнать причину. Из других тем здесь и в других местах, кажется, что дополнительный код вектора может быть причиной сброса денежных средств, но хотелось бы проверить его более подробно

Используемые флаги компилятора: -O2, -fexорого-оптимизации,--fast-math и -march = native с g ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...