Schnelles Lesen der C-Struktur, wenn sie das char-Array enthält

8

Ich habe die folgende C-Struktur

%Vor%

Ich habe jetzt eine Reihe von Dateien in C mit Tausenden dieser Strukturen erstellt. Ich muss sie mit C # lesen und Geschwindigkeit ist ein Problem.

Ich habe folgendes in C # gemacht

%Vor%

Und dann lese ich die Daten aus der Datei mit

%Vor%

Das funktioniert einwandfrei und ich kann die Daten einfach aus den Dateien abrufen.

Ich habe gelesen, dass ich Dinge beschleunigen kann, wenn ich anstelle von GCHandle.Alloc / Marshal.PtrToStructure C ++ / CLI oder C # unsafe Code verwende. Ich habe einige Beispiele gefunden, aber sie beziehen sich nur auf Strukturen ohne Arrays fester Größe.

Meine Frage ist, gibt es in meinem speziellen Fall eine schnellere Möglichkeit, Dinge mit C ++ / CLI oder C # unsicherem Code zu tun?

BEARBEITEN

Zusätzliche Leistungsinformationen (ich habe ANTS Performance Profiler 7.4 verwendet):

66% meiner CPU-Zeit werden von Aufrufen von Marshal.PtrToStructure verwendet.

In Bezug auf I / O werden nur 6 von 105ms verwendet, um aus der Datei zu lesen.

    
Morat 30.01.2013, 14:21
quelle

3 Antworten

4

In diesem Fall müssen Sie P / Invoke nicht explizit verwenden, da Sie die Struktur nicht zwischen verwaltetem und nativem Code übergeben müssen. Also könntest du das stattdessen tun. Es würde diese unbrauchbare GC-Handle-Zuweisung vermeiden und nur das zuweisen, was benötigt wird.

%Vor%

Ich bin mir nicht sicher, dass du viel schneller sein kannst.

    
Simon Mourier 30.01.2013, 14:36
quelle
1

Wahrscheinlich möchten Sie nicht verwalteten Code verwenden, was ich tun würde:

  1. Erstellen Sie ein C ++ / CLI-Projekt und lassen Sie Ihren vorhandenen c # -Code portieren und dort laufen
  2. Bestimmen Sie, wo sich Ihr Engpass befindet (verwenden Sie den Profiler)
  3. schreibe diesen Abschnitt des Codes in C ++, schreibe ihn aus dem C ++ / CLI-Code und stelle sicher, dass er funktioniert, profiliere ihn erneut
  4. Umgeben Sie Ihren neuen Code mit "#pragma unmanaged"
  5. profile es erneut

Sie werden wahrscheinlich ein gewisses Maß an Geschwindigkeitssteigerung erhalten, aber es ist möglicherweise nicht das, was Sie erwarten.

    
David Hope 30.01.2013 14:31
quelle
0

Es ist mit viel Fiddleness möglich, einige Arrays von Strukturen recht schnell zu lesen, aber da diese Technik blitable Typen benötigt, besteht die einzige Möglichkeit darin, einen festen Puffer von Bytes für den Schlüssel zu erstellen, anstatt a zu verwenden Zeichenfolge.

Wenn Sie das tun, müssen Sie unsicheren Code verwenden, also ist es wahrscheinlich nicht wirklich wert.

Aber nur für die Neugierigen ist das, wie Sie ein super-schnelles schnelles Lesen und Schreiben dieser Strukturen machen können, auf Kosten von unsicheren Code und einer Menge Geige:

%Vor%     
Matthew Watson 30.01.2013 14:42
quelle