【发布时间】:2015-05-15 05:46:50
【问题描述】:
经过大量测试后,我有十几种算法在 C# 中没有给我令人满意的速度,但在 C++ 中工作得很好(实现方式相同,几乎从 C# 复制粘贴到 C++,大量基于大型数组数据集)。
现在我知道如何从 C# 调用 C++ 代码并且我不想切换整个应用程序,所以我正在考虑这样做。然而,这些微内核必须大量并行运行,并且由于 .net 中的并行性非常好,我正在考虑在这方面处理它,并让 C# 中的每个线程调用任何相关的内容。
听起来我不应该有任何线程安全问题(我没有调用任何 C++ lib 功能,所有方法都只是将数组作为输入并返回数组作为输出,数据不共享跨 C++ 或 C# 端的线程)。但是因为我从来没有这样做过,所以我的问题是:这完全愚蠢吗?我是不是在房间里错过了一头巨大的大象,还是我应该没事?我是否需要担心我是在 C++ 端使用 MT 运行时还是不考虑我不调用任何系统调用?
每个微内核都足够慢(100+ms),.net 边界交叉不是一个大问题,并且在 C++ 中速度更快,但我宁愿避免移植我的所有代码和测试以意识到我错过了一些明显的东西。
【问题讨论】:
-
现在还有单线程运行时吗?
-
没有任何线索,我在上次检查的选项中看到了不同的运行时,但我的问题不是专门针对这个的,我通常不使用 C++,并且想确保不需要为此做任何特别的事情以这种方式使用(以避免出现类似“哦,你不知道编组到 C++ 库不是线程安全的?”之类的意外情况,经过大量的测试工作,显然是假的例子,但因为我没有知识,我宁愿问也不愿浪费时间)
-
嗯,你确实提到了这个问题。但是,正如您所描述的,从不同的线程调用 pinvokes 应该没有问题。不过我想我会使用 C++/CLI。
-
不就是添加第三层吗?听起来像是更多的工作
-
作为一般规则,互操作可能更有效。为什么那会是第三层。将 C++ 代码编译成 C++/CLI 模块。
标签: c# c++ .net performance pinvoke