Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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#性能-我是否应该用C++;?_C#_Visual C++_C++ Cli_Unmanaged_Heavy Computation - Fatal编程技术网

C#性能-我是否应该用C++;?

C#性能-我是否应该用C++;?,c#,visual-c++,c++-cli,unmanaged,heavy-computation,C#,Visual C++,C++ Cli,Unmanaged,Heavy Computation,我正在为一个定量库构建一个原型,该库使用图像处理技术进行一些信号分析。我完全用C#构建了初始原型,但性能不如预期。大部分计算是通过大量的矩阵计算完成的,这些计算占用了大部分时间 我想知道是否将C++和CLI接口写入非托管C++代码是值得的。有人经历过这样的事吗?其他优化C#性能的建议是受欢迎的。在我看来,矩阵数学最好是在本机代码中完成的。即使C++库通常允许绑定到较低级别的实现,如。 有一个C#LAPACK端口(在同一个站点上也是C#BLAS),你可以试试,但如果它比本机代码快,我会感到惊讶。我

我正在为一个定量库构建一个原型,该库使用图像处理技术进行一些信号分析。我完全用C#构建了初始原型,但性能不如预期。大部分计算是通过大量的矩阵计算完成的,这些计算占用了大部分时间


我想知道是否将C++和CLI接口写入非托管C++代码是值得的。有人经历过这样的事吗?其他优化C#性能的建议是受欢迎的。

在我看来,矩阵数学最好是在本机代码中完成的。即使C++库通常允许绑定到较低级别的实现,如


有一个C#LAPACK端口(在同一个站点上也是C#BLAS),你可以试试,但如果它比本机代码快,我会感到惊讶。

我在C#中做了很多图像处理工作,是的,我通常在性能重要的重载代码中使用本机代码,但我只使用了PInvokes,没有使用C++/CLI接口。不过,这并不需要很多时间


有很多好的.NET分析器。这个是我个人最喜欢的。它可能会帮助您可视化瓶颈所在。

曾经有一段时间,用C/C++编写肯定会更好,但C#optimizer和JIT现在非常好,对于纯数学来说,可能没有什么区别

当您必须处理内存和可能的数组时,就会出现差异。即便如此,我仍然会使用C(或F),然后优化热点。JIT非常擅长优化小的、短期的对象

对于数组,您必须担心C#对每个访问进行边界检查。请阅读以下内容:


<>你自己测试一下——我发现C是可比的——有时更快。

< P>你应该在C++中编写计算重程序,通过优化C语言你不能达到C++性能的任何地方。假设计算需要相当长的时间,调用包装器的开销可以忽略不计。我在C++和C语言中都已经完成了编码,从来没有见过.NET框架代码与C++相媲美的场合。有一些实例,其中C++运行得更好,但是因为C++中缺少适当的库或错误的编码,所以它更好。如果你能在C语言和C++中同样地编写代码,我将用C++编写性能代码,其他的东西都是C。
<如果X是世界上最好的C++程序员,Y是最好的C程序员,那么大多数时间X都能写出比Y更快的代码。然而,在大多数情况下,y可以比x更快地完成编码。

这里很难给出一个明确的答案,但是如果性能是一个问题,我会找到一个经过时间测试的库,其中包含您需要的性能,并将其包装起来

< C++ > C++中的编译器有一个优化器,CLR运行时有一个按需优化的JTIt。因此,理论上,C++只会在第一次调用时胜过C。p> 然而,理论和实践并不相同。对于更复杂的算法,您也会遇到内存管理器之间的差异,以及优化技术的成熟度。如果你想要轶事证据,你可以找到一些


就我个人而言,我发现在本机库中进行繁重的计算,并使用c++/CLI调用它,在计算成为最大瓶颈的情况下,会有很好的提升。和往常一样,在做任何优化之前都要确保这一点。

在C#中,数学计算的性能非常差。我发现C#中的数学计算速度有多慢,这让我大吃一惊。在C和C++中写一个循环,有几个乘法,正弦,COS,…两者之间的差别是巨大的

我不知道托管C++,但在非托管C++ ABD中,它会使所有的UpGain通过P/UnjKE公开粒度接口应该有很少的性能命中。


这就是我为繁重的实时图像处理所做的。

唯一合理的语言基准:

你自己看看吧

我完全用C#构建了初始原型,但性能不如预期

那么您有两个选择:

在C++中构建另一个原型,看看它是如何比较的,或者优化你的C代码。无论你用什么语言编写,你的代码都不会很快,除非你对它进行了分析、优化、分析和优化。在C++中尤其如此。如果你在C语言中写最快的可能实现,并将它与C++中最快的实现方式进行比较,那么C++版本很可能会更快。但它将以开发时间为代价。编写高效的C++代码并不重要。如果您对该语言不熟悉,那么您很可能会编写效率非常低的代码,特别是如果您来自C#或Java,在这两种语言中,工作方式不同,成本也不同

如果您只编写一个工作实现,而不太担心性能,那么我猜C版本可能会更快

但这实际上取决于您所追求的性能(尤其是您需要执行的操作的成本)。从托管代码到本机代码的转换会带来开销,因此对于经常执行的短操作来说,这是不值得的

< C++中的数字压缩代码可以和FORTRAN中的代码一样快(给出或取百分之几),但要实现这一点,需要使用很多高级技术(表达式模板和大量元编程)或一些相当复杂的库来实现。

这是值得的吗?或者C可以满足你的需要吗?< / P >不确定我们可以提供准确的指导而不需要看到一些代码。理论上,你可以在C++中写更多的性能代码…但是你也可以在C++中写更糟的代码。在你遇到麻烦之前。