Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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#不安全的指针?_C#_C++_Performance_Memory_Unsafe Pointers - Fatal编程技术网

我应该用C/C++;或者我';我擅长C#不安全的指针?

我应该用C/C++;或者我';我擅长C#不安全的指针?,c#,c++,performance,memory,unsafe-pointers,C#,C++,Performance,Memory,Unsafe Pointers,我目前正在编写一个C#应用程序,它可以进行大量的数字信号处理,这涉及到许多小型的微调内存xfer操作。我使用不安全的指针编写了这些例程,它们的性能似乎比我最初想象的要好得多。但是,我希望应用程序尽可能快 我会从C或C++中重写这些例程得到任何性能上的好处,还是应该坚持不安全的指针?我想知道与C/C++相比,不安全指针在性能方面给表带来了什么 编辑:在这些例程中,我没有做任何特殊的事情,只是做一些普通的DSP工作:从一个阵列到另一个阵列的缓存友好型数据传输,其中包括大量的乘法、加法、位移位等。我希

我目前正在编写一个C#应用程序,它可以进行大量的数字信号处理,这涉及到许多小型的微调内存xfer操作。我使用不安全的指针编写了这些例程,它们的性能似乎比我最初想象的要好得多。但是,我希望应用程序尽可能快

<>我会从C或C++中重写这些例程得到任何性能上的好处,还是应该坚持不安全的指针?我想知道与C/C++相比,不安全指针在性能方面给表带来了什么

编辑:在这些例程中,我没有做任何特殊的事情,只是做一些普通的DSP工作:从一个阵列到另一个阵列的缓存友好型数据传输,其中包括大量的乘法、加法、位移位等。我希望C/C++例程与它们的C#对应程序看起来几乎一样(如果不是完全相同的话)


编辑:非常感谢所有聪明的答案。我学到的是,除非进行某种SSE优化,否则仅通过直接端口不会显著提高性能。假设所有现代C/C++编译器都能利用它,我期待着尝试一下。如果有人对结果感兴趣,请告诉我,我会把它们贴到某个地方。(可能需要一段时间)。

< P>我建议如果你的DSP代码中有任何算法,<强>需要< /St>优化,那么你应该真正在汇编中编写它们,而不是C或C++。 一般来说,对于现代处理器和硬件,没有太多的场景需要或保证优化所涉及的工作。您是否确实发现了任何性能问题?如果没有,那么最好还是坚持你所拥有的。在大多数简单算术的情况下,不安全的C#不太可能比C/C++慢很多


您考虑过C++/CLI吗?那你就可以两全其美了。如果需要的话,它甚至允许你使用内嵌汇编程序。

< P>我认为你应该C++编程(管理或非托管)或C语言编写你的DSP例程,使用一个坚固的设计,但不试图从一开始就优化所有的东西,然后你应该对代码进行配置,找到瓶颈并尝试优化那些。 试图从一开始就产生“最佳”代码会让您从编写工作代码开始就分心。记住,80%的优化只会影响20%的代码,因为在很多情况下,只有10%的代码会占用90%的CPU时间。(YMMV,取决于应用类型)

当我试图在图形工具包中优化alpha混合的使用时,我试图首先以“裸机”的方式使用SIMD:内联汇编程序。很快,我发现最好使用SIMD内部的特性,而不是纯汇编,因为编译器能够通过重新排列个人操作码,最大限度地使用CPU中的不同处理单元来进一步优化可读取的C++内部结构。
不要低估编译器的功能

优化DSP代码的另一种方法是使其缓存友好。如果有许多滤波器应用于信号,则应将所有滤波器应用于每个点,即,最里面的环路应在滤波器上,而不是在数据上,例如:

for each n do t´[n] = h(g(f(t[n])))
通过这种方式,您将大大减少对缓存的垃圾回收,并且很可能获得良好的速度提升

我会得到绩效福利吗 在C/C中重写这些例程++ 还是我应该坚持使用不安全的指针

理论上,这并不重要——一个完美的编译器将优化代码,无论是C还是C++,成为最好的汇编程序。 然而,在实践中,C几乎总是更快,特别是对于指针型算法——它尽可能接近机器代码,而无需在汇编中进行编码

在性能方面,C++并没有带来任何好处——它是作为C的面向对象版本构建的,对于程序员来说,它具有更多的功能和易用性。虽然在某些方面,它的性能会更好,因为给定的应用程序将从面向对象的角度受益,但它并不是为了性能更好,而是为了提供另一个抽象级别,以便更容易地编程复杂的应用程序

<>所以,不,你可能不会看到通过切换到C++的性能增加。 然而,对你来说,发现它可能比避免花时间在它上面更重要——我认为将它移植过来并进行分析是一项值得的活动。如果处理器有C++或java用法的某些指令,编译器知道这些代码,那么它很可能会利用C中不可用的特性。 然而,DSP处理器是出了名的复杂野兽,你越接近汇编,你就可以获得更好的性能(也就是说,你的代码越是手动调整)。C比C++更接近汇编。
-Adam

首先让我回答关于“安全”与“不安全”的问题:你在帖子中说“我希望应用程序尽可能快”,这意味着你不想弄乱“安全”或“托管”指针(甚至不要提及垃圾收集)

关于您选择的语言: C/C++让您可以更轻松地处理底层数据,而不需要任何与现在每个人都在使用的花哨容器相关的开销。是的,它是很好的拥抱容器,防止你的分段故障。。。但是与容器相关的更高级别的抽象会破坏您的性能

在我的工作中,我们的代码必须运行得很快。一个例子是我们的多相重采样器在工作,发挥指针和掩蔽操作和定点DSP滤波。。。如果没有对内存和位操作的低级别控制,这些聪明的技巧都是不可能的