我目前正在编写一个C#应用程序,它执行大量的数字信号处理,这涉及许多小的微调内存xfer操作.我使用不安全的指针编写了这些例程,它们的表现似乎比我初想的要好得多.但是,我希望应用程序尽可能快.
我可以通过用C或C++重写这些例程来获得任何性能优势,还是应该坚持使用不安全的指针?我想知道与C/C++相比,性能方面的不安全指针会给表带来什么.
编辑:我在这些例程中没有做任何特别的事情,只是正常的DSP事情:缓存友好的数据传输从一个阵列到另一个阵列,在这个过程中有很多乘法,加法,位移等.我希望C/C++例程与它们的C#对应物看起来几乎相同(如果不相同).
编辑:非常感谢大家的所有聪明的答案.我所学到的是,除非进行某种SSE优化,否则我只会通过直接端口获得性能上的任何显着提升.假设所有现代C/C++编译器都可以利用它,我期待着尝试一下.如果有人对结果感兴趣,请告诉我,我会将它们发布到某个地方.(可能需要一段时间).
实际上我只是在图像处理领域完成了你所要求的.我从C#unsafe指针开始,然后进入C++/CLI,现在我用C++编写所有代码.事实上,从那里我改变了从C++中的指针到SSE处理器指令,所以我一路走了.尚未到达汇编程序,虽然我不知道是否需要,但我看到一篇关于CodeProject的文章显示SSE可以像内联汇编程序一样快,如果你想要我,我可以找到它.
我一直在做的事情是我的算法在C#中使用不安全的指针从大约每秒1.5-2帧到现在每秒40帧.C#和C++/CLI肯定比C++慢,即使使用指针,我也无法使用这些语言获得每秒10帧以上的速度.一旦我切换到C++,我立刻得到了每秒15-20帧的东西.一些更聪明的变化和SSE让我达到每秒40帧.所以,如果你想要我的经验速度,那么值得一试.有明显的性能提升.
优化DSP代码的另一种方法是使其缓存友好.如果您有很多过滤器应用于您的信号,您应该将所有过滤器应用于每个点,即您的最内层循环应该在过滤器上而不是数据,例如:
for each n do t´[n] = h(g(f(t[n])))
通过这种方式,您可以将缓存垃圾减少很多,并且最有可能获得良好的速度提升.
我认为你应该用C++(托管或非托管)或C#编写你的DSP例程,使用可靠的设计,但不试图从一开始就优化所有内容,然后你应该分析你的代码并找到瓶颈,并尝试优化这些远.
尝试从一开始就生成"最佳"代码会让您分散注意力,使您无法首先编写工作代码.请记住,80%的优化只会影响20%的代码,因为在很多情况下,只有10%的代码负责90%的CPU时间.(YMMV,因为它取决于应用程序的类型)
当我试图在我们的图形工具包中优化我们对alpha混合的使用时,我试图首先使用SIMD"裸机"方式:内联汇编程序.很快我发现使用SIMD内在函数而不是纯汇编更好,因为编译器能够通过重新排列各个操作码并最大化CPU中不同处理单元的使用来进一步优化具有内在函数的可读C++.
不要低估编译器的强大功能!