Openmesh:使用 Python 更新面法线比使用 C++ 更快?
Openmesh: updating face normals faster with Python than with C++?
我用 OpenMesh 创建了以下简单的 C++ 脚本:
#include <string>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
struct MyTraits : OpenMesh::DefaultTraits{
typedef OpenMesh::Vec3d Point;
typedef OpenMesh::Vec3d Normal;
};
typedef OpenMesh::TriMesh_ArrayKernelT<MyTraits> MyMesh;
int main(int argc, char *argv[]){
std::string filename = "filename.stl";
MyMesh OM_mesh;
OM_mesh.request_face_normals();
OM_mesh.request_halfedge_normals();
OM_mesh.request_vertex_normals();
OM_mesh.request_face_status();
OM_mesh.request_edge_status();
OM_mesh.request_halfedge_status();
OM_mesh.request_vertex_status();
OpenMesh::IO::Options ropt;
ropt += OpenMesh::IO::Options::Binary;
ropt += OpenMesh::IO::Options::FaceNormal;
OpenMesh::IO::read_mesh(OM_mesh, filename);
for(int k=0; k<1000; k++){
OM_mesh.update_face_normals();
}
return 0;
}
此外,我使用 OpenMesh 绑定开发了以下简单的 Python 脚本:
import openmesh as OM
filename = "filename.stl"
OM_mesh = OM.TriMesh()
OM_mesh.request_face_normals()
OM_mesh.request_halfedge_normals()
OM_mesh.request_vertex_normals()
OM_mesh.request_face_status()
OM_mesh.request_edge_status()
OM_mesh.request_halfedge_status()
OM_mesh.request_vertex_status()
options = OM.Options()
options += OM.Options.Binary
options += OM.Options.FaceNormal
OM.read_mesh(OM_mesh, filename, options)
for k in range(1000):
OM_mesh.update_face_normals()
这两个脚本都会更新加载网格的面法线 1000 次。我预计 C++ 脚本会比 Python 脚本快得多,但实际上恰恰相反。我发现 C++ 脚本花费了大约 8 秒,而 Python 脚本只花费了大约 0.3 秒。
这怎么可能? Python 绑定是否与 "wrap" C++ update_face_normals 方法不同?谢谢
我发现在用 C++ 读取文件时应该使用读取选项,如下所示:
OpenMesh::IO::read_mesh(OM_mesh, filename, ropt);
这样做,C++ 的速度比 Python 高。但是,在.off 文件中,此更新不正确,但这是另一个问题。
我用 OpenMesh 创建了以下简单的 C++ 脚本:
#include <string>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
struct MyTraits : OpenMesh::DefaultTraits{
typedef OpenMesh::Vec3d Point;
typedef OpenMesh::Vec3d Normal;
};
typedef OpenMesh::TriMesh_ArrayKernelT<MyTraits> MyMesh;
int main(int argc, char *argv[]){
std::string filename = "filename.stl";
MyMesh OM_mesh;
OM_mesh.request_face_normals();
OM_mesh.request_halfedge_normals();
OM_mesh.request_vertex_normals();
OM_mesh.request_face_status();
OM_mesh.request_edge_status();
OM_mesh.request_halfedge_status();
OM_mesh.request_vertex_status();
OpenMesh::IO::Options ropt;
ropt += OpenMesh::IO::Options::Binary;
ropt += OpenMesh::IO::Options::FaceNormal;
OpenMesh::IO::read_mesh(OM_mesh, filename);
for(int k=0; k<1000; k++){
OM_mesh.update_face_normals();
}
return 0;
}
此外,我使用 OpenMesh 绑定开发了以下简单的 Python 脚本:
import openmesh as OM
filename = "filename.stl"
OM_mesh = OM.TriMesh()
OM_mesh.request_face_normals()
OM_mesh.request_halfedge_normals()
OM_mesh.request_vertex_normals()
OM_mesh.request_face_status()
OM_mesh.request_edge_status()
OM_mesh.request_halfedge_status()
OM_mesh.request_vertex_status()
options = OM.Options()
options += OM.Options.Binary
options += OM.Options.FaceNormal
OM.read_mesh(OM_mesh, filename, options)
for k in range(1000):
OM_mesh.update_face_normals()
这两个脚本都会更新加载网格的面法线 1000 次。我预计 C++ 脚本会比 Python 脚本快得多,但实际上恰恰相反。我发现 C++ 脚本花费了大约 8 秒,而 Python 脚本只花费了大约 0.3 秒。
这怎么可能? Python 绑定是否与 "wrap" C++ update_face_normals 方法不同?谢谢
我发现在用 C++ 读取文件时应该使用读取选项,如下所示:
OpenMesh::IO::read_mesh(OM_mesh, filename, ropt);
这样做,C++ 的速度比 Python 高。但是,在.off 文件中,此更新不正确,但这是另一个问题。