原始内存流上的C#数学性能

本文关键字:性能 内存 原始 | 更新日期: 2023-09-27 17:58:27

我正在考虑用C#而不是C++编写一个视频处理库。C++具有在原始视频帧缓冲区上使用指针的优点。相反,C#在缓冲区上有一个MemoryStream,它可以来回查找。

数学公式需要逐一应用于每个像素;或者如果在C++中使用汇编优化,则为8乘8或16乘16。

在C#中这样做与在C++或SSE2程序集中这样做相比如何?

C#的优点是它可以使用所有特定于CPU的指令,如AVX和AVX2,因为它可以动态地进行最终编译,它做得有多好?

对于这样的任务,是否有最佳实践可以让C#获得最佳性能?

与指针相比,在MemoryStream中移动光标也会使语法更加复杂。有没有简化的方法?

编辑:根据这里和其他地方的评论,似乎有两个选项。

  1. System.Numerics.Vectors
    https://msdn.microsoft.com/en-us/library/dn879696(v=vs.110).aspx#Anchor_4

  2. NumPy和SciPy是Python中此类工作的流行选项,并已移植到.NET中
    https://www.infoq.com/news/2011/07/NumPy-NET

关于这两个选项的优点、缺点和局限性,有什么想法吗?System.Numerics.Vector是否仅适用于x86 x64?SciPy是否使用SIMD优化?

如果在C#中可以获得接近C++SIMD的性能,而不必编写同一函数的几个版本(C++、SSE2、AVX),这将具有很大的优势。它将允许在不使用SIMD的地方进行SIMD优化。

编辑2:我在哪里都读不到NumPy和SciPy支持SIMD优化,所以System.Numerics.Vectors是最好的选择。

原始内存流上的C#数学性能

SIMD指令只支持少数数据类型,这些类型随.NET 4.6提供,或者您可以使用System.Numerics.Vectors NuGet包在.NET 4.5上获得它。

老实说,如果您有编写SSE2程序集或SIMD C++代码的经验,那么这些代码的性能可能会更好,并且应该坚持使用您最有经验的代码。