C++/CLI 与本机标头互操作的性能较差

问题描述 投票:0回答:1

在尝试为 CGAL 库的部分实现包装器时,我遇到了一些性能问题。其中一些似乎与 C++/CLI 互操作相关。为了确定问题,我创建了一个简单的示例,对我想要包装的 CGAL 的一些部分进行了一些调用。我认为具体的调用对于这个问题来说并不是非常重要,但我将其包含在内以供参考。我的程序如下所示:

std::ifstream stream1("Sphere1.OFF");
std::ifstream stream2("Sphere2.OFF");

Polyhedron P1 = Polyhedron();
Polyhedron P2 = Polyhedron();

stream1 >> P1;
stream2 >> P2;

Nef_polyhedron N1(P1);
Nef_polyhedron N2(P2);

Nef_polyhedron N3 = N1 + N2;

Polyhedron 和 Nef_polyhedron 是 CGAL 类型,定义为:

typedef CGAL::Simple_cartesian<CGAL::Lazy_exact_nt<CGAL::Gmpq> > Kernel;
typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;

如果我只是在没有 CLR 支持的情况下运行程序编译,它会在大约 10 秒内运行。这并不理想,但目前必须这样做。问题是,如果我启用 CLR 支持,运行这个小示例程序的时间将增加三倍,达到 30 秒以上。

我怀疑这个问题与 CGAL 主要仅作为标头实现有关。因此,Kernel、Polyhedron 和 Nef_polyhedron 都是使用 CLR 支持进行编译的,因此无法预测互操作调用发生的频率。我们的想法是,

Nef_polyhedron N3 = N1 + N2;
调用应该是对本机代码的单个互操作调用,以减少开销。

我尝试使用

#pragma managed(push,off)
来强制标头进行本机编译,但这只是将执行时间加倍到大约 70 秒

为什么我的 CLR 性能受到如此大的影响?它可能与 Polyhedron 和 Nef_polyhedron 类型的编组有关吗?如果是这样,在编组时指定这些类型是否会有帮助?

c++-cli interop cgal
1个回答
0
投票

CGAL 在 GPL 许可证下分发,这使得它与 C++\CLI 不兼容,因此它只能在 Windows 上运行。

无论如何,仅仅在CGAL许可证的条件下,你不能将CGAL与C++\CLI结合使用

© www.soinside.com 2019 - 2024. All rights reserved.