我有一个C ++程序,可以在40k记录上进行文本处理。我们用C ++开发了这个程序,因为我们认为它会更快。然后我使用process-execute在我的C#程序中使用/执行了这个C ++部分,但问题是我们觉得我们失去了对执行流程的控制:无法调试C ++部分。我想在C#程序中更多地集成C ++。我用谷歌搜索,发现我必须为我的C ++生成一个DLL,然后我可以在我的C#程序中使用它。
问题:
答案 0 :(得分:4)
你有几个选择:
在.NET中编写处理并测量性能。如果不可接受,请尝试优化它。如果它仍然太慢,则恢复为非托管代码。但是认为非托管代码会更快,因此在不测量IMHO的情况下编写非托管代码是错误的方法。
由于您已经编写了非托管代码,因此可以通过导出将执行处理的函数将其公开为动态链接库:
extern "C" __declspec(dllexport) int DoProcessing(int);
接下来,您将导入托管代码中的函数:
class Program
{
[DllImport("mylibrary.dll")]
static extern int DoProcessing(int input);
static void Main()
{
int result = DoProcessing(123);
}
}
如果处理的输入和输出不是很复杂并且可以轻松编组,则此方法有效。它的开销很小。
使用C++ CLI编译非托管代码作为托管程序集并直接引用它。
答案 1 :(得分:1)
在DLL中包装C ++代码不会以任何方式减慢它。
是的,在DLL中调用函数(与可执行文件相反)会有(轻微)性能损失 - 例如编译器无法内联调用。但这通常是完全可以忽略不计的开销(3-5个CPU指令)
这可能是最简单的方法。
答案 2 :(得分:0)
你无法判断这是否足够快,无法衡量你的目标。尽可能以最简单的方式(将现有的C ++代码包装在DLL中)并查看它是否符合您的性能目标。我猜它可能会。
从托管中调用本机代码确实会为每个方法调用带来一些开销 - 如果您的程序受到大量计算限制并且每个记录将多次调用本机方法,则可能会因为互操作而导致速度变慢。如果您的代码调用本机代码一次以批量处理所有40k记录,那么执行互操作的成本将因处理记录所花费的实际时间而大大相形见绌。如果记录来自较慢的存储介质,例如通过网络,则与I / O时间相比,您的处理时间可能会微不足道。
答案 3 :(得分:0)
尝试在C#中实现它。
40k记录似乎是一个非常低的数字。处理C#中的40k记录可能会(取决于您需要对每条记录执行多少处理)实际上比您当前生成的流程更快。
将您的C应用程序编译为dll并加载进程中的其他内容。这仍然会有一些开销,但它会比产生一个额外的过程小得多
答案 4 :(得分:0)
我同意AdamRalph - 我认为通过在CPP中编写此代码,您获得的任何东西都不会产生任何影响。
BTW是CPP代码管理的吗?如果这就是为什么你不把它链接到你的C#代码并避免所有互操作开销