与 C++ 相比,将 CPLEX 与 C#.NET 结合使用的效率如何?

Jos*_*wry 0 .net c# c++ cplex

假设我们的 UI 必须采用 C#.NET...

与 C#.NET API 相比,使用 C++ API for CPLEX 是否会影响性能?我想知道,因为如果可能的话,我希望避免跨越托管/非托管边界,但我想更多地了解 C#.NET API 的情况。

C#.NET 是否只是实现了 C++ 的托管/非托管边界?它做得好吗?

Tim*_*ick 5

大约 18 年来,我们一直在使用 C++ 或 C# 甚至一些 Java 编写 CPLEX + Concert 代码。这些是针对许多不同客户的许多独立项目。许多项目的首选最初是 C++,因为我们在 C# 出现之前就开始了。当时 C# 太新了,没有得到广泛的信任。但从 2005 年左右开始,我们一直更喜欢 C#,因为用 C# 编程更容易。我们在 2004 年左右做了一个项目,必须用 C++ 编写 CPLEX 建模代码,但必须使用 C# 数据库接口库(这是一个复杂的项目,这些选择背后的推理在今天没有意义)。使用 C# 和 C++ 之间的接口会产生一定的开销;但这些影响远小于使用不同数据库访问方法(例如 ado.net 与 odbc)之间的差异。

实际上,对于我们的大多数项目来说,使用 C++ 带来的额外效率提升非常小。通常,创建的系统将花费超过 90%(或 99%)的时间进行 CPLEX 库调用。我们遇到过很多情况,其中 C++ 或 C# 代码可能需要 1 或 2 分钟来读取和处理输入数据并创建 CPLEX 建模变量和约束,然后花费 2-10 小时在 cplex.solve() 内解决问题。因此,即使在 CPLEX 之外使用 C++(而不是 C#)进行处理速度快十倍,总体时间也不会发生太大变化。

如果您正在编写构建和解决许多(小)模型的复杂算法内容(例如,如果您正在执行列生成或 LNS 或类似的操作),那么 C++ 可能会带来可衡量的好处,但从更广泛的角度来看可能没有太多好处。

我会选择您更喜欢使用的任何语言。正确编写代码比节省几秒钟更重要。