2010-12-06 10 views
9

Guten Morgen,C++/CLI-Leistung im Vergleich zu Nativem C++?

Ich schreibe eine Rechtschreibprüfung, die für den Fall leistungskritisch ist. Da ich eine Verbindung zu einer Datenbank herstellen und die GUI mit C# erstellen möchte, habe ich eine Bearbeitungsentfernungsberechnungsroutine in C geschrieben und eine DLL kompiliert, die ich in C# unter Verwendung von DllImport verwende. Das Problem ist, dass ich glaube, (obwohl ich möglicherweise falsch), dass die Marshalling Wörter nacheinander von String bis char * verursacht eine Menge Overhead. Ich dachte darüber nach, C++/CLI zu verwenden, damit ich direkt in .NET mit dem String-Typ arbeiten kann ... Meine Frage ist dann, wie sich C++/CLI-Leistung mit nativem C-Code für schwere mathematische Berechnungen und Array-Zugriffe vergleicht?

Vielen Dank.

+0

Ich denke, CIL tun das gleiche, aber implizit. –

+0

Warum übergeben Sie Wörter nacheinander? Pass ganzen txt. –

Antwort

4

C++/CLI muss auch eine Art Marshalling durchführen.

Wie bei allen leistungsbezogenen Problemen sollten Sie messen und optimieren. Sind Sie sicher, dass C# nicht schnell genug für Ihre Zwecke ist? Unterschätzen Sie nicht die Optimierungen, die der JIT-Compiler machen wird. Spekulieren Sie nicht über den Overhead einer Sprachimplementierung, nur um verwaltet zu werden, ohne es zu versuchen. Wenn es nicht genug ist, haben Sie unsicheren C# -Code (mit Zeigern) vor dem Versuch, nicht verwalteten Code?

In Bezug auf das Leistungsprofil von C++/CLI hängt es wirklich von der Art und Weise, wie es verwendet wird. Wenn Sie zu verwaltetem Code (CIL) mit (/clr:pure) kompilieren, wird es sich nicht sehr von C# unterscheiden. Native C++ - Funktionen in C++/CLI haben ähnliche Leistungsmerkmale wie reines C++. Das Übergeben von Objekten zwischen systemeigener C++ - und CLI-Umgebung verursacht einen gewissen Mehraufwand.

+0

Unsafe C# -Code ist etwa doppelt so langsam wie die C-Funktion, die ich mit DllImport importiere. – Miguel

1

Ich würde nicht erwarten, dass der Engpass mit dem DLLImport sein wird.
Ich habe Programme geschrieben, die DLLImport mehrere hundert Mal pro Sekunde aufrufen und es funktioniert einfach gut.
Sie zahlen eine kleine Leistungsgebühr, aber die Strafe ist gering.

1

Gehen Sie nicht davon aus, dass Sie wissen, was optimiert werden muss. Lassen Sie die Stichprobe Ihnen sagen.

Ich habe ein paar Rechtschreibkorrektoren gemacht, und die Art, wie ich es getan habe (outlined here) war, das Wörterbuch als Trie im Speicher zu organisieren, und suche danach. Wenn die Anzahl der Wörter groß ist, kann die Größe des Trie durch gemeinsame Suffixe stark reduziert werden.

+0

Das ist nicht der Fall ... Ich benutze tatsächlich einen BK-Baum, also unterscheidet sich mein Ansatz deutlich von dem, was Sie gesagt haben. – Miguel

+0

@ Miguel: OK, korrigiert. Auf jeden Fall habe ich im Trie-Zweig eine Suche nach Verzweigungen durchgeführt, die ziemlich gut funktioniert haben. Eine Alternative ist die gemischte Tiefe zuerst/Breite zuerst, aber ich dachte Branch-and-Bound war etwa die gleiche Leistung und viel flexibler, in Bezug auf die Arten von Rechtschreibfehlern, die es behandeln könnte. –

Verwandte Themen