Heim Backend-Entwicklung C#.Net-Tutorial Implementierung des C#-Singleton-Musters und Beispiele für Leistungsvergleiche

Implementierung des C#-Singleton-Musters und Beispiele für Leistungsvergleiche

May 16, 2018 pm 05:08 PM
.net

In diesem Artikel werden hauptsächlich relevante Informationen zur Implementierung und zum Leistungsvergleich des C#-Singleton-Modus vorgestellt. Freunde in Not können sich auf die

Einführung

Ein Singleton bezieht sich auf eine Klasse, die nur eine Instanz haben kann (genauer gesagt handelt es sich in C# um eine Klasse, die in jeder AppDomain nur eine Instanz haben kann). Sie wird in der Softwareentwicklung verwendet. Einer der häufigsten Modi. Nachdem der erste Benutzer eine Instanz dieser Klasse erstellt hat, können nachfolgende Benutzer, die diese Klasse verwenden müssen, nur die zuvor erstellte Instanz verwenden und können keine neue Instanz erstellen, wenn sie zum ersten Mal verwendet wird Mehrere Singleton-Implementierungsmethoden in C# und Analyse der Thread-Sicherheits- und Leistungsunterschiede zwischen ihnen ineffizient) zu einer Lazy-Loadable-, Thread-sicheren und effizienten Implementierung, sie alle haben einige grundlegende Dinge gemeinsam:

Singleton-Klassen haben nur einen privaten parameterlosen Konstruktor
  • Die Klasse wird als versiegelt deklariert (nicht erforderlich)
  • Es gibt eine statische Variable in der Klasse, die einen Verweis auf die erstellte Instanz enthält
  • Die Singleton-Klasse stellt eine statische Methode oder Eigenschaft bereit, um einen Verweis auf die erstellte Instanz zurückzugeben (z. B. GetInstance)
  • Mehrere Implementierungen

Ein nicht-Thread-sicher

Diese Methode ist nicht Thread-sicher, es werden zwei Threads gleichzeitig ausgeführt, wenn (Instanz == null). und das Erstellen zweier verschiedener Instanzen ersetzt die neu erstellte, wodurch die zuvor erhaltene Referenz leer ist >

Zweite einfache Thread-sichere Implementierung
//Bad code! Do not use!
public sealed class Singleton
{
  private static Singleton instance = null;
  private Singleton()
  {
  }

  public static Singleton instance
  {
    get
    {
      if (instance == null)
      {
        instance = new Singleton();
      }
      return instance;
    }
  }
}
Nach dem Login kopieren

Verglichen mit Implementierung eins, diese Version fügt eine Sperre für die Instanz hinzu. Dies vermeidet Thread-Konflikte in der ersten Implementierung. Da die Sperre jedoch jedes Mal verwendet wird Wenn die Instanz aufgerufen wird und die Kosten für den Aufruf der Sperre hoch sind, führt diese Implementierung zu einem gewissen Leistungsverlust. Beachten Sie, dass wir hier ein neues privates Objektinstanz-Vorhängeschloss verwenden, um den Sperrvorgang nicht direkt zu implementieren Das direkte Sperren des Typs birgt Risiken, da er theoretisch in jedem Code aufgerufen werden kann.

public sealed class Singleton
{
  private static Singleton instance = null;
  private static readonly object padlock = new object();

  Singleton()
  {
  }

  public static Singleton Instance
  {
    get
    {
      lock (padlock)
      {
        if (instance == null)
        {
          instance = new Singleton();
        }
        return instance;
      }
    }
  }
}
Nach dem Login kopieren
Hinweis : In C# kann derselbe Thread mehrere Vorgänge für ein Objekt ausführen. Er wird einmal gesperrt. Wenn jedoch verschiedene Threads gleichzeitig gesperrt werden, kann es zu Thread-Wartezeiten oder einem schwerwiegenden Deadlock kommen. Wenn wir Sperren verwenden, versuchen wir daher, private Variablen in der Klasse zu sperren, um die obige Situation zu vermeiden.

Thread-sichere Implementierung der dreifachen doppelten Überprüfung

Während die Thread-Sicherheit gewährleistet ist, vermeidet diese Implementierung auch den Sperrvorgang bei jedem Instanzaufruf, was auch der Fall ist eine gewisse Zeit sparen. Diese Implementierung hat jedoch auch Nachteile:

public sealed calss Singleton
{
  private static Singleton instance = null;
  private static readonly object padlock = new object();

  Singleton()
  {
  }

  public static Singleton Instance
  {
    get
    {
      if (instance == null)
      {
        lock (padlock)
        {
          if (instance == null)
          {
            instance = new Singleton();
          }
        }
      }
      return instance;
    }
  } 
}
Nach dem Login kopieren
1 funktioniert nicht in Java. (Die konkreten Gründe sind im Originaltext zu finden, aber ich verstehe hier nicht viel)

2 Programmierer können bei der eigenen Implementierung leicht Fehler machen. Wenn Sie in diesem Modus eigene Änderungen am Code vornehmen, seien Sie sehr vorsichtig, da die Logik der doppelten Überprüfung relativ komplex ist und es aufgrund mangelnder Denkweise leicht zu Fehlern kommen kann.


Vier Thread-sichere Implementierungen ohne Sperren


Diese Implementierung ist sehr einfach und verwendet keine Sperren, ist aber dennoch Thread-sicher. Hier wird eine statische, schreibgeschützte Singleton-Instanz verwendet. Wenn die Singleton-Instanz zum ersten Mal aufgerufen wird, wird sie direkt von .NET gesteuert Und es wird nur einmal in einer AppDomaing erstellt.

Diese Implementierung hat auch einige Nachteile:
public sealed class Singleton
{
  //在Singleton第一次被调用时会执行instance的初始化
  private static readonly Singleton instance = new Singleton();

  //Explicit static consturctor to tell C# compiler 
  //not to mark type as beforefieldinit
  static Singleton()
  {
  }

  private Singleton()
  {
  }

  public static Singleton Instance
  {
    get
    {
      return instance;
    }
  }
}
Nach dem Login kopieren

1 Der Zeitpunkt der Erstellung der Instanz ist unbekannt und jeder Aufruf an Singleton erstellt die Instanz im Voraus

2 Schleifenaufrufe des statischen Konstruktors. Wenn es zwei Klassen A und B gibt, den statischen Konstruktor von A, der B aufruft, und den statischen Konstruktor von B, der A aufruft, bilden diese beiden einen zirkulären Aufruf, der ernsthaft zum Absturz des Programms führen kann. 3 Wir müssen den statischen Konstruktor von Singleton manuell hinzufügen, um sicherzustellen, dass der Singleton-Typ nicht automatisch mit dem beforefieldinit-Attribut hinzugefügt wird, um sicherzustellen, dass die Instanz erstellt wird, wenn Singleton zum ersten Mal aufgerufen wird. 4Das schreibgeschützte Attribut kann zur Laufzeit nicht geändert werden. Wenn wir die Instanz verwerfen und eine neue Instanz neu erstellen müssen, während das Programm ausgeführt wird, kann diese Implementierungsmethode nicht erfüllt werden.



Fünf vollständig verzögerte Instanziierung

Implementierung fünf ist ein Wrapper für Implementierung vier. Dadurch wird sichergestellt, dass die Instanz nur in der get-Methode von Instance aufgerufen und nur vor dem ersten Aufruf initialisiert wird. Es handelt sich um eine Version der Implementierung 4, die Lazy Loading gewährleistet.

Six verwendet den Lazy-Typ
public sealed class Singleton
{
  private Singleton()
  {
  }

  public static Singleton Instance 
  {
    get
    {
      return Nested.instance;
    }
  }

  private class Nested
  {
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Nested()
    {
    }

    internal static readonly Singleton instance = new Singleton();
  }
}
Nach dem Login kopieren

.NET4 oder höher unterstützt Lazy Der Code gewährleistet die Thread-Sicherheit und die Lazy-Loading-Eigenschaften des Singletons.

Leistungsunterschied

In der vorherigen Implementierung haben wir den Schwerpunkt auf die Thread-Sicherheit und das verzögerte Laden des Codes gelegt. Wenn die Initialisierung Ihrer Singleton-Klasse jedoch im tatsächlichen Einsatz kein zeitaufwändiger Vorgang ist oder die Initialisierungssequenz keine Fehler verursacht, ist die verzögerte Initialisierung eine entbehrliche Funktion, da die für die Initialisierung benötigte Zeit vernachlässigbar ist.

Wenn Ihre Singleton-Instanz in tatsächlichen Nutzungsszenarien häufig aufgerufen wird (z. B. in einer Schleife), ist der Leistungsverbrauch, der durch die Gewährleistung der Thread-Sicherheit verursacht wird, stärker zu berücksichtigen.

Um die Leistung dieser Implementierungen zu vergleichen, habe ich einen kleinen Test durchgeführt, bei dem ich die Singletons in diesen Implementierungen 900 Millionen Mal durchlaufen habe und jedes Mal die Instanzmethode aufgerufen habe, um eine count++-Operation auszuführen, jede Million einmal ausgegeben , die Ausführungsumgebung ist Visual Studio für Mac auf MBP. Die Ergebnisse sind wie folgt:


线程安全性 延迟加载 测试运行时间(ms)
实现一 15532
实现二 45803
实现三 15953
实现四 不完全 14572
实现五 14295
实现六 22875

Die Testmethode ist nicht streng, aber es ist dennoch ersichtlich, dass Methode zwei die zeitaufwändigste ist, da jedes Mal, fast dreimal, die Sperre aufgerufen werden muss so lange wie die anderen. An zweiter Stelle steht die Implementierung mit dem .NET-Lazy-Typ, der etwa die Hälfte mehr als die anderen ist. Die übrigen vier weisen keine offensichtlichen Unterschiede auf.

Zusammenfassung

Im Allgemeinen unterscheiden sich die verschiedenen oben genannten Singleton-Implementierungsmethoden unter der heutigen Computerleistung nicht sehr, es sei denn, Sie benötigen besonders viel Parallelität Bei der Aufrufinstanz müssen Sie Probleme mit der Sperrleistung berücksichtigen.

Für normale Entwickler ist es gut, Methode 2 oder Methode 6 zu verwenden, um Singletons zu implementieren. Die Methoden 4 und 5 erfordern ein gutes Verständnis des C#-Laufprozesses und der Implementierung. Sie erfordern bestimmte Fähigkeiten und die Zeit, die sie sparen ist noch begrenzt.

Zitat

Der größte Teil dieses Artikels wurde aus Implementing the Singleton Pattern in C# übersetzt, wobei einige meiner eigenen Erkenntnisse hinzugefügt wurden. Das ist mir aufgefallen, als ich nach „statischer schreibgeschützter Feldinitialisierer vs. statischer Konstruktorinitialisierung“ gesucht habe. Ich möchte den beiden Autoren hier meinen Dank aussprechen.

Das obige ist der detaillierte Inhalt vonImplementierung des C#-Singleton-Musters und Beispiele für Leistungsvergleiche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie sind die Berufsaussichten von C#? Wie sind die Berufsaussichten von C#? Oct 19, 2023 am 11:02 AM

Ganz gleich, ob Sie Anfänger oder erfahrener Profi sind: Die Beherrschung von C# ebnet den Weg für Ihre Karriere.

Teilen Sie mehrere .NET-Open-Source-KI- und LLM-bezogene Projekt-Frameworks Teilen Sie mehrere .NET-Open-Source-KI- und LLM-bezogene Projekt-Frameworks May 06, 2024 pm 04:43 PM

Die Entwicklung von Technologien der künstlichen Intelligenz (KI) ist heute in vollem Gange und sie haben in verschiedenen Bereichen großes Potenzial und Einfluss gezeigt. Heute wird Dayao Ihnen 4 .NET Open-Source-KI-Modell-LLM-bezogene Projekt-Frameworks vorstellen und hofft, Ihnen einige Referenzen zu geben. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel ist ein Open-Source-Softwareentwicklungskit (SDK), das für die Integration großer Sprachmodelle (LLM) wie OpenAI und Azure entwickelt wurde

.NET-Leistungsoptimierungstechnologie für Entwickler .NET-Leistungsoptimierungstechnologie für Entwickler Sep 12, 2023 am 10:43 AM

Wenn Sie ein .NET-Entwickler sind, müssen Sie sich der Bedeutung der Optimierung von Funktionalität und Leistung bei der Bereitstellung hochwertiger Software bewusst sein. Durch den fachgerechten Einsatz der bereitgestellten Ressourcen und die Verkürzung der Ladezeiten der Website schaffen Sie nicht nur ein angenehmes Erlebnis für Ihre Nutzer, sondern senken auch die Infrastrukturkosten.

Leistungsunterschiede zwischen Java-Framework und .NET-Framework Leistungsunterschiede zwischen Java-Framework und .NET-Framework Jun 03, 2024 am 09:19 AM

In Bezug auf die Verarbeitung von Anforderungen mit hoher Parallelität bietet .NETASP.NETCoreWebAPI eine bessere Leistung als JavaSpringMVC. Zu den Gründen gehören: AOT-Frühkompilierung, die die Startzeit verkürzt, wobei Entwickler für die Zuweisung und Freigabe von Objektspeicher verantwortlich sind.

C# .NET -Interview Fragen und Antworten: Stufen Sie Ihr Fachwissen auf C# .NET -Interview Fragen und Antworten: Stufen Sie Ihr Fachwissen auf Apr 07, 2025 am 12:01 AM

C#.NET -Interviewfragen und Antworten umfassen Grundkenntnisse, Kernkonzepte und erweiterte Nutzung. 1) Grundkenntnisse: C# ist eine von Microsoft entwickelte objektorientierte Sprache und wird hauptsächlich im .NET-Framework verwendet. 2) Kernkonzepte: Delegation und Ereignisse ermöglichen dynamische Bindungsmethoden, und LINQ bietet leistungsstarke Abfragefunktionen. 3) Erweiterte Verwendung: Asynchrone Programmierung verbessert die Reaktionsfähigkeit und Expressionsbäume werden für die dynamische Codekonstruktion verwendet.

Advanced C# .NET Tutorial: Ace Ihr nächstes Senior Developer Interview Advanced C# .NET Tutorial: Ace Ihr nächstes Senior Developer Interview Apr 08, 2025 am 12:06 AM

Das Interview mit C# Senior Developer erfordert das Mastering von Kernwissen wie asynchrones Programmieren, LINQ und interne Arbeitsprinzipien von .NET -Frameworks. 1. Asynchrones Programmieren vereinfacht die Operationen durch Async und wartet auf die Verbesserung der Anwendungsreaktionsfähigkeit. 2.LinQ betreibt Daten im SQL -Stil und achtet auf die Leistung. 3. Die CLR des Net -Frameworks verwaltet den Speicher, und die Müllsammlung muss mit Vorsicht verwendet werden.

C# .NET: Erforschen von Kernkonzepten und Programmierfundamentaldaten C# .NET: Erforschen von Kernkonzepten und Programmierfundamentaldaten Apr 10, 2025 am 09:32 AM

C# ist eine moderne, objektorientierte Programmiersprache, die von Microsoft und als Teil des .NET-Frameworks entwickelt wurde. 1.C# unterstützt die objektorientierte Programmierung (OOP), einschließlich Einkapselung, Vererbung und Polymorphismus. 2. Asynchrones Programmieren in C# wird über Async implementiert und wartet auf Schlüsselwörter, um die Reaktionsfähigkeit der Anwendungen zu verbessern. 3.. Verwenden Sie LINQ, um Datensammlungen präzise zu verarbeiten. 4. Häufige Fehler umfassen Null-Referenzausnahmen und Indexausnahmen außerhalb des Bereichs. Zu den Debugging -Fähigkeiten gehört die Verwendung eines Debuggers und Ausnahmeberechnung. 5. Leistungsoptimierung umfasst die Verwendung von StringBuilder und das Vermeiden von unnötigem Packung und Unboxing.

C# Code in .NET: Erforschen des Programmiervorgangs C# Code in .NET: Erforschen des Programmiervorgangs Apr 12, 2025 am 12:02 AM

Der Programmierungsprozess von C# in .NET enthält die folgenden Schritte: 1) Schreiben von C# Code, 2) Kompilieren in eine mittlere Sprache (IL) und 3), die durch die .NET -Laufzeit (CLR) ausführt. Die Vorteile von C# in .NET sind die moderne Syntax, das leistungsstarke Typsystem und die enge Integration in das .NET -Framework, das für verschiedene Entwicklungsszenarien geeignet ist, von Desktop -Anwendungen bis hin zu Webdiensten.

See all articles