Code-Analyse: Verwendung von ref und Span zur Verbesserung der Programmleistung in .Net Core

巴扎黑
Freigeben: 2017-08-14 11:53:12
Original
1684 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich der einfache Implementierungscode für die Verwendung von ref und Span zur Verbesserung der Programmleistung vorgestellt

1

Tatsächlich wissen viele Studenten bereits, dass Ref eine Sprachfunktion von C# 7.0 ist. Es bietet Entwicklern einen Mechanismus, um lokale Variablenreferenzen und Wertreferenzen zurückzugeben .
Span ist ebenfalls ein komplexer Datentyp, der auf der Ref-Syntax basiert. In der zweiten Hälfte des Artikels werde ich ein Beispiel zeigen, wie man ihn verwendet.

2. Ref-Schlüsselwort

Ob Ref- oder Out-Taste, es handelt sich um eine Sprachfunktion, die schwer zu verstehen und zu bedienen ist, z Wie Betriebszeiger in der C-Sprache bringt eine solche High-Level-Syntax immer einige Nebenwirkungen mit sich, aber ich glaube nicht, dass dies irgendetwas hat, und nicht jeder C#-Entwickler muss ein tiefes Verständnis dieser internen Betriebsmechanismen haben, egal was Kompliziert ist, dass es den Menschen nur die freie Wahl bietet, Risiko und Flexibilität sind niemals vereinbar.

Sehen wir uns ein paar Beispiele an, um die Identität von Referenzen und Zeigern zu veranschaulichen. Natürlich können die folgenden Verwendungsmethoden vor C# 7.0 verwendet werden:


public static void IncrementByRef(ref int x)
{
 x++;
}
public unsafe static void IncrementByPointer(int* x)
{
 (*x)++;
}
Nach dem Login kopieren

Die beiden oben genannten Funktionen verwenden ref und unsichere Zeiger, um den Parameter +1 jeweils zu vervollständigen.


int i = 30;
IncrementByRef(ref i);
// i = 31
unsafe{
 IncrementByPointer(&i);
}
// i = 32
Nach dem Login kopieren

Die folgenden Funktionen werden von C# 7.0 bereitgestellt:

1.ref-Locals (verweisen auf lokale Variablen)


int i = 42;
ref var x = ref i;
x = x + 1;
// i = 43
Nach dem Login kopieren

In diesem Beispiel ist es die Referenz x der lokalen i-Variablen. Wenn der Wert von x geändert wird, wird der Wert der Die Variable i ändert sich ebenfalls.

2.ref-Returns (Rückgabewertreferenz)

ref-Returns ist eine leistungsstarke Funktion in C# 7. Der folgende Code spiegelt seine Funktionen am besten wider. Diese Funktion wird bereitgestellt eine Referenz auf ein Element im int-Array:


public static ref int GetArrayRef(int[] items, int index) => ref items[index];
Nach dem Login kopieren

Rufen Sie die Referenz auf das Element im Array über den Index ab, wenn Sie den Referenzwert ändern. Auch das Array ändert sich entsprechend.

3. Span

System.Span ist Teil des .Net Core-Kerns unter der System.Memory.dll-Assembly. Diese Funktion ist derzeit unabhängig und wird möglicherweise in Zukunft in CoreFx integriert.

Wie verwende ich sie? Verweisen Sie auf das folgende NuGet-Paket unter dem vom .Net Core 2.0 SDK erstellten Projekt:


 <ItemGroup>
 <PackageReference Include="System.Memory" Version="4.4.0-preview1-25305-02" />
 <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.4.0-preview1-25305-02" />
 </ItemGroup>
Nach dem Login kopieren

Oben haben wir ähnliche Zeiger (T*) gesehen, die mit der Referenz bereitgestellt werden können Schlüsselwort) Methode zum Betreiben von Einzelwertobjekten. Grundsätzlich gilt das Betreiben von Zeigern unter dem .NET-System als keine gute Sache. Natürlich stellt uns .NET Referenzen für den sicheren Betrieb von Einzelwertreferenzen zur Verfügung. Ein einzelner Wert stellt jedoch nur einen kleinen Teil der Anforderungen des Benutzers für die Verwendung von „Zeigern“ dar. Die häufigere Situation liegt vor, wenn eine Reihe von „Elementen“ in einem kontinuierlichen Speicherbereich betrieben werden.

Span wird als zusammenhängender Speicherblock bekannter Länge und bekannter Art dargestellt. In vielerlei Hinsicht ist es T[] oder ArraySegment sehr ähnlich, da es sicheren Zugriff auf Speicherbereichszeiger bietet. Tatsächlich verstehe ich, dass es sich um eine Abstraktion des Operationszeigers (void*) in .NET handelt. Entwickler, die mit C/C++ vertraut sind, sollten besser wissen, was das bedeutet.

Die Eigenschaften von Span sind wie folgt:

• Abstrahiert das Typsystem aller kontinuierlichen Speicherbereiche, einschließlich: Arrays, nicht verwaltete Zeiger, Stapelzeiger, feste oder angeheftete verwaltete Daten und Verweise auf interne Wertebereiche
•Unterstützt CLR-Standardobjekttypen und -werttypen
•Unterstützt Generika
•Unterstützt GC, im Gegensatz zu Zeigern, die verwaltet werden müssen

Werfen wir einen Blick auf die Definition von Span, die grammatikalisch und semantisch mit ref verwandt ist:


public struct Span<T> {
 ref T _reference;
 int _length;
 public ref T this[int index] { get {...} }
 ...
}
public struct ReadOnlySpan<T> {
 ref T _reference;
 int _length;
 public T this[int index] { get {...} }
 ...
}
Nach dem Login kopieren

Als nächstes werde ich verwenden ein intuitives Beispiel zur Veranschaulichung des Verwendungsszenarios von Span; nehmen wir das Abfangen von Zeichen und die Zeichenkonvertierung (Konvertierung in einen Ganzzahltyp) als Beispiel:

Wenn eine Zeichenfolge string content = "content-length:123", konvertiert werden soll, konvertieren Sie 123 in eine Integer-Typ, normalerweise Die Methode besteht darin, zuerst Substring zu verwenden, um die Zeichenfolge abzuschneiden, die nichts mit numerischen Zeichen zu tun hat. Der Konvertierungscode lautet wie folgt:


string content = "content-length:123";
Stopwatch watch1 = new Stopwatch();
watch1.Start();
for (int j = 0; j < 100000; j++)
{
 int.Parse(content.Substring(15));
}
watch1.Stop();
Console.WriteLine("\tTime Elapsed:\t" + watch1.ElapsedMilliseconds.ToString("N0") + "ms");
Nach dem Login kopieren

Warum Verwenden Sie dieses Beispiel? Dies ist ein typisches Verwendungsszenario: Bei jeder Manipulation eines Strings wird ein neues String-Objekt generiert Wenn eine große Anzahl von Operationen ausgeführt wird, wird der GC unter Druck gesetzt.

Verwenden Sie Span, um diesen Algorithmus zu implementieren:


string content = "content-length:123";
ReadOnlySpan<char> span = content.ToCharArray(); 
span.Slice(15).ParseToInt();
watch.Start();
for (int j = 0; j < 100000; j++)
{
 int icb = span.Slice(15).ParseToInt();
}
watch.Stop();
Console.WriteLine("\tTime Elapsed:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
Nach dem Login kopieren

Der Algorithmus zum Konvertieren von Zeichenfolgen in int wird mithilfe von ReadonlySpan implementiert. Dies ist auch ein typisches Verwendungsszenario von Span. Die offiziellen Szenarien sind auch für Szenarien geeignet, in denen kontinuierlicher Speicher mehrfach wiederverwendet wird.

Der Konvertierungscode lautet wie folgt:


public static class ReadonlySpanxtension
{
 public static int ParseToInt(this ReadOnlySpan<char> rspan)
 {
  Int16 sign = 1;
  int num = 0;
  UInt16 index = 0;
  if (rspan[0].Equals(&#39;-&#39;)){
   sign = -1; index = 1;
  }
  for (int idx = index; idx < rspan.Length; idx++){
   char c = rspan[idx];
   num = (c - &#39;0&#39;) + num * 10;
  }
  return num * sign;
 }
}
Nach dem Login kopieren

Endlich

Oben Die Zeit für 100.000 Aufrufe der beiden Codeteile ist wie folgt:


String Substring Convert:
  Time Elapsed: 18ms
ReadOnlySpan Convert:
  Time Elapsed: 4ms
Nach dem Login kopieren

Derzeit ist die entsprechende Unterstützung für Span nur ausreichend In Zukunft wird CoreFx Span für viele APIs verwenden und implementieren. Es ist ersichtlich, dass die Leistung von .Net Core in Zukunft immer leistungsfähiger wird.

Das obige ist der detaillierte Inhalt vonCode-Analyse: Verwendung von ref und Span zur Verbesserung der Programmleistung in .Net Core. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage