此预定义函数会降低程序的性能

时间:2016-02-27 11:32:58

标签: c++ performance point-cloud-library point-clouds c++-standard-library

我正在开发PCL(Point Cloud Library)项目。其中一部分需要我剪切点云,为此我需要知道给定点云的最小和最大坐标。

PCL提供了一个名为 getminmax3d()的预定义函数。我试过并且运行良好,唯一的问题是,当我输入一个大的点云文件需要很多时间。我自己定义了getminmax3d(),花费的时间更少。我不明白为什么这两个表现得像这样。

我尝试了5点云数据文件。在所有情况下,与我定义定义的程序相比,使用预定义函数的程序需要很长时间。

这是代码:
第一个实现 - 它使用预定义函数getminmax3d()

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>

int main (int, char**)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
  cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::io::loadPCDFile<pcl::PointXYZ> ("your_pcd_file.pcd", *cloud);
  pcl::PointXYZ minPt, maxPt;
  pcl::getMinMax3D (*cloud, minPt, maxPt);
  std::cout << "Max x: " << maxPt.x << std::endl;
  std::cout << "Max y: " << maxPt.y << std::endl;
  std::cout << "Max z: " << maxPt.z << std::endl;
  std::cout << "Min x: " << minPt.x << std::endl;
  std::cout << "Min y: " << minPt.y << std::endl;
  std::cout << "Min z: " << minPt.z << std::endl;
  return (0);
}

第二个实现 - 此源代码使用用户定义的函数定义来替换 getminmax3d()

的功能
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/time.h>

int main (int argc, char** argv)
{
   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
   if (pcl::io::loadPCDFile<pcl::PointXYZ> ("rhino.pcd", *cloud) == -1) //* load the file
   {
     PCL_ERROR ("Couldn't read file rhino.pcd \n");
     return (-1);
   }
   float min_x = cloud->points[0].x, min_y = cloud->points[0].y, min_z = cloud->points[0].z, max_x = cloud->points[0].x, max_y = cloud->points[0].y, max_z = cloud->points[0].z;
   pcl::StopWatch watch;
   for (size_t i = 1; i < cloud->points.size (); ++i){
       if(cloud->points[i].x <= min_x )
           min_x = cloud->points[i].x;
       else if(cloud->points[i].y <= min_y )
           min_y = cloud->points[i].y;
       else if(cloud->points[i].z <= min_z )
           min_z = cloud->points[i].z;
       else if(cloud->points[i].x >= max_x )
           max_x = cloud->points[i].x;
       else if(cloud->points[i].y >= max_y )
           max_y = cloud->points[i].y;
       else if(cloud->points[i].z >= max_z )
           max_z = cloud->points[i].z;
   }
   pcl::console::print_highlight ("Time taken: %f\n", watch.getTimeSeconds());
   std::cout << "Min x: " << min_x <<"\t";
   std::cout << "Max x: " << max_x << std::endl;
   std::cout << "Min y: " << min_y <<"\t";
   std::cout << "Max y: " << max_y << std::endl;
   std::cout << "Min z: " << min_z <<"\t";
   std::cout << "Max z: " << max_z << std::endl;
   return (0);
}

我尝试了以下5点云文件的两个程序 Armadillo Bunny Dragon Buddha Rhino

获得的结果:
ttf :时间因素
ttf = 15表示用户定义比预定义函数快15倍。通过对两种实施方案平均进行10次试验来测量ttf值。

PCD file    Filetype   File size    ttf
Rhino.pcd   XYZ        2.57 MB      15.260
Bun_zipper  XYZCI      1.75 MB      17.422
Armadillo   XYZ        5.26 MB      15.847
Dragon_vrip XYZ        14.7 MB      17.013
Happy_vrip  XYZ        18.0 MB      14.981

我想知道为什么预定义功能需要更多时间?我想减少我的程序源代码行。我一直认为使用标准头文件及其功能可以提供最佳性能,但在这种情况下似乎失败了。

This is where you can find standard definition. 有人请帮助我找出为什么第二次实现需要花费更少的时间(约15次),即使getminmax3d()的标准定义与我的类似。

1 个答案:

答案 0 :(得分:1)

pcl::getMinMax3D的实施效率非常低。要搜索最小和最大点,请执行以下操作:

Eigen::Array4f min_p, max_p;
min_p.setConstant (FLT_MAX);
max_p.setConstant (-FLT_MAX);
for (size_t i = 0; i < cloud.points.size (); ++i)
{
   // ... (check the validity of the point if it is not a dense cloud)

   pcl::Array4fMapConst pt = cloud.points[i].getArray4fMap ();
   min_p = min_p.min (pt);
   max_p = max_p.max (pt);
}

如果您检查getArray4fMap()功能:

typedef Eigen::Map<Eigen::Array4f, Eigen::Aligned> Array4fMap;

inline pcl::Array4fMap getArray4fMap() const { 
    return (pcl::Array4fMap(data)); 
}

对于云中的每个点,它构建一个Eigen::Map,然后将其与当前的最小和最大点进行比较。这非常低效。