Ich überlege, eine Video-Verarbeitungsbibliothek in C# anstelle von C++ zu schreiben. C++ hat den Vorteil, mit Zeigern auf dem rohen Videoframe-Puffer zu arbeiten. C# hat stattdessen einen MemoryStream in diesem Puffer, den es hin und her suchen kann.C# Math-Leistung auf Raw-Speicher-Stream
Mathematische Formeln müssen auf jedes Pixel einzeln angewendet werden; oder 8 mal 8 oder 16 mal 16, wenn Assembly-Optimierung in C++ verwendet wird.
Wie wird dies in C# mit dem Ausführen in C++ oder mit SSE2-Assembly verglichen?
C# hat den Vorteil, dass es alle CPU-spezifischen Anweisungen wie AVX und AVX2 verwenden kann, weil es die finale Kompilierung on-the-fly durchführt, und wie gut funktioniert es?
Gibt es Best Practices, um C# für solche Aufgaben optimal zu nutzen?
Durch Verschieben des Cursors in einem MemoryStream wird die Syntax im Vergleich zu einem Zeiger ebenfalls komplexer. Gibt es Möglichkeiten, dies zu vereinfachen?
Edit: Basierend auf Kommentaren hier und anderswo, scheint es 2 Optionen.
System.Numerics.Vectors
https://msdn.microsoft.com/en-us/library/dn879696(v=vs.110).aspx#Anchor_4NumPy und SciPy sind beliebte Optionen für eine solche Arbeit in Python, und welche haben in .NET
https://www.infoq.com/news/2011/07/NumPy-NET
portiert Ideen über die Vor- und Nachteile dieser beiden Optionen? Funktioniert System.Numerics.Vectors mit x86 nur x64? Verwendet SciPy die SIMD-Optimierung?
Wenn Leistung in der Nähe von C++ SIMD in C# erhalten werden kann, ohne mehrere Versionen derselben Funktion (C++, SSE2, AVX) zu schreiben, hätte dies große Vorteile. Es würde SIMD-Optimierungen an Orten ermöglichen, die es sonst nicht verwenden würden.
Edit2: Nirgendwo kann ich lesen, dass NumPy und SciPy die SIMD-Optimierung unterstützen, daher ist System.Numerics.Vectors der richtige Weg.
C# unterstützt Zeiger auch in 'unsicheren' Kontexten, aber die Leistung ist schlechter als C++, da SSE nicht unterstützt wird. – Dai
Alles ist möglich, aber Sie konkurrieren mit bestehenden Codec-Implementierungen, die über viele Jahre hinweg sehr sorgfältig abgestimmt wurden. Denken Sie nur daran, wenn Sie auch Jahre zur Verfügung haben. –
Dies ist für die Entwicklung von AviSynth Plugins mit .NET. Es gibt eine ganze Gemeinschaft von Programmierern, die solche Plugins entwickeln; meist in C++ und Assembly. http://forum.doom9.org/showthread.php?t=144663 –