与C++相比,将CPLEX与C#一起使用的效率是多少

本文关键字:效率 多少 相比 C++ CPLEX 一起 | 更新日期: 2023-09-27 18:00:52

如果我们的UI必须在C#中…

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

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

与C++相比,将CPLEX与C#一起使用的效率是多少

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

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

如果你正在编写复杂的算法来构建和解决许多(小(模型(例如,如果你正在进行列生成或LNS或类似操作(,那么C++可能会带来可衡量的好处,但可能不会带来太大的好处。

无论你用什么语言我都愿意。获得正确的代码比节省几秒钟更重要。

ILOG官方文档有这样的说法(强调我的(:

对API方法的每次调用都要经过一个包装层与使用C++API相比,这可能会在创建模型时导致轻微的性能开销,具体取决于API函数调用的数量。由于只调用很少的API函数来加载和求解模型,因此在通常情况下,开销可以忽略不计,但如果使用低级Concert、CP Optimizer或CPLEX®API来创建完整的模型(例如,使用INumExpr API逐行构建矩阵,或使用API将IConstraint对象逐个添加到IModel(,则开销可能会变得很重要。因此,建议尽可能使用OPL语言对问题进行建模,并仅对需要它的部分(运行时添加等(使用低级Concert API

是的,C++更快,检查这个:

  • http://www.codeproject.com/Articles/253444/PInvoke-Performance
  • http://msdn.microsoft.com/en-us/library/ky8kkddw.aspx

C#p/Invoke为错误处理等增加了一些开销。