pcl::PointCloud 官方提供了一个添加点云的函数接口push_back()但是实际中经常看到有人先调用resize()函数再逐个进行赋值理由是这样更快。本文对两种方法的速度进行对比。首先详细介绍一下输入数据和这两种方法1. 输入数据本文中输出数据是随机生成的这不影响后续的速度测试先把这些数据存储在一个pcl::PointCloud中。#include pcl/point_cloud.h #include pcl/point_types.h #include ctime #include cstdlib #include chrono pcl::PointCloudpcl::PointXYZ cloud; // Fill in the cloud data cloud.width 10000000; cloud.height 1; cloud.is_dense false; cloud.points.resize (cloud.width * cloud.height); for (size_t i 0; i cloud.points.size (); i) { cloud.points[i].x 1024 * rand () / (RAND_MAX 1.0f); cloud.points[i].y 1024 * rand () / (RAND_MAX 1.0f); cloud.points[i].z 1024 * rand () / (RAND_MAX 1.0f); }2. 先调用resize()再逐个赋值pcl::PointCloudpcl::PointXYZ cloud_1; cloud_1.width cloud.width; cloud_1.height cloud.height; cloud_1.is_dense cloud.is_dense; cloud_1.points.resize(cloud.width * cloud.height); for (size_t i 0; i cloud.points.size(); i) { cloud_1.points[i].x cloud.points[i].x; cloud_1.points[i].y cloud.points[i].y; cloud_1.points[i].z cloud.points[i].z; }3. 调用官方接口push_back()注意这里面在调用push_back()之前先调用了reserve()这样才能大幅减少该方法的时间开销。pcl::PointCloudpcl::PointXYZ cloud_2; cloud_2.points.reserve(cloud.points.size()); for (size_t i 0; i cloud.points.size(); i) { cloud_2.push_back(cloud.points[i]); }4. 时间开销对比下面是其中一次测试的结果Duration 1: 0.0543553sDuration 2: 0.0487025s如果在调用官方接口push_back()之前不再用reserve()则结果为Duration 1: 0.0543018sDuration 2: 0.132413s可以看到其开销明显上升。4. 结论多次测试显示使用官方的push_back接口并不慢前提是调用reserve()函数。所以完全没有必要自己resize()再赋值。