C#性能-我是否应该用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++和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++中写更糟的代码。在你遇到麻烦之前。