Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与C+相比,将CPLEX与C#.NET结合使用的效率是多少+;?_C#_C++_.net_Cplex - Fatal编程技术网

与C+相比,将CPLEX与C#.NET结合使用的效率是多少+;?

与C+相比,将CPLEX与C#.NET结合使用的效率是多少+;?,c#,c++,.net,cplex,C#,C++,.net,Cplex,如果我们的用户界面必须在C#NET中 使用CPLEX与C*.NETAPI相比,C++的性能有什么影响吗? 我想知道,因为如果可能的话,我希望尽可能避免跨越托管/非托管边界,但我希望更多地了解C#NET API的情况 C++的.NET是否实现了C++的托管/非托管边界?它做得好吗?< /P> < P>是的,C++更快,检查这个: C++ P/java调用错误处理等开销, < P>我们已经在C++或C语言中甚至在Java中编写了CPLEX + CONNECT代码18年左右。这些是许多不同

如果我们的用户界面必须在C#NET中

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


C++的.NET是否实现了C++的托管/非托管边界?它做得好吗?< /P> < P>是的,C++更快,检查这个:


C++ P/java调用错误处理等开销,

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

实践中,对于大多数项目,使用C++的额外效率都很小。通常,所创建的系统将在CPLEX库调用中花费超过90%(或99%)的时间。我们已经有许多情况下,C++或C语言中的代码需要1或2分钟来读取和处理输入数据,并创建CPLEX建模变量和约束,然后2-10小时解决CPLEX(SOLVER)中的问题。所以即使C++中的CPLEX之外的处理是C的十倍,整个时间也不会发生很大的变化。

如果你编写复杂的算法性的东西来构建和解决许多(小的)模型(例如,如果你正在做列生成或LNS或类似的),那么C++中可能有可测量的好处,但在更广阔的范围内可能没有什么好处。 我会选择你更喜欢的语言。正确使用代码比节省几秒钟更重要。

我的重点是:

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


当你对代码进行了剖析时,性能的好处在哪里呢?我还没有开始执行。它减少了使用不同级别的优化编译器和C编译器的效率。C是.NET .cPLEXAPI,使用P/Unk调用吗?到目前为止我知道库是用C编程的,它是从C代码中调用的,以确保C++的可用性。检查c#源代码。你不会看到在CPLEX中实现.net接口的c#源代码-这是一个专有产品,不是开源的。不相关。你使用CPLEX解决复杂的优化问题,这将比最复杂的pinvoke场景慢很多数量级。任何相关的开销都不会发生om使用基本pinvoke,但需要重新构建复杂的数据结构(根据文档,情况似乎确实如此)@ TimChIPPuntDrRek,您可以看到一些其他的工具,如反射或逆向工程。如果代码不模糊,99%比安全的,这是非常有用的。这是非常有用的。谢谢。我主要关心的是,你支付代码维护的价格,通过写C和C++的边界。我一直在寻找。即使使用他们警告过的API,在典型的使用中,开销也很小。事实上,我们将一个项目从使用OPL切换到使用低级别Concert调用,并且模型设置时间减少了一半。实际优化时间根本没有受到影响(您也不希望受到影响)。我怀疑这取决于您的使用模式,特别是您如何访问数据以提供给Concert或OPL,但在我们的情况下,.NET比OPL快,而不是慢。