22 Stimmen

Leistungsüberhang für Eigenschaften in .NET

Ich habe irgendwo gelesen, dass es besser ist, öffentliche Eigenschaften zu haben, als öffentliche Mitglieder in einer Klasse zu haben.

  1. Liegt das nur an der Abstraktion und der Modularität? Gibt es noch andere Gründe, die übergeordnet sind?

  2. Die Eigenschaftszugriffe werden vom Compiler in Funktionsaufrufe umgewandelt. Für Eigenschaften ohne Backup-Speicher (z.B. public string UserName { get; set; } ), wie hoch wäre der Leistungsaufwand im Vergleich zu einem direkten Mitgliederzugriff? (Ich weiß, dass es normalerweise keinen Unterschied machen sollte, aber in einigen meiner Codes wird millionenfach auf Eigenschaften zugegriffen).

Bearbeiten1: Ich habe einige Testcodes über Integer-Mitglieder und Eigenschaften ausgeführt und die öffentlichen Mitglieder waren etwa 3-4 Mal so schnell wie die Eigenschaften. (~57 ms. vs. ~206 ms. in Debug und 57 vs. 97 in Release war der häufigste Laufwert). Bei 10 Millionen Lese- und Schreibvorgängen sind beide Werte klein genug, um eine Änderung nicht zu rechtfertigen.

Code:

    class TestTime1
{
    public TestTime1() { }
    public int id=0;
}
class TestTime2
{
    public TestTime2() { }
    [DefaultValue(0)]
    public int ID { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            TestTime1 time1 = new TestTime1();
            TestTime2 time2 = new TestTime2();
            Stopwatch watch1 = new Stopwatch();
            Stopwatch watch2 = new Stopwatch();
            watch2.Start();
            for (int i = 0; i < 10000000; i++)
            {
                time2.ID = i;
                i = time2.ID;
            }
            watch2.Stop();
            watch1.Start();
            for (int i = 0; i < 10000000; i++)
            {
                time1.id = i;
                i = time1.id;
            }
            watch1.Stop();
            Console.WriteLine("Time for 1 and 2 : {0},{1}",watch1.ElapsedMilliseconds,watch2.ElapsedMilliseconds);

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.In.ReadLine();
    }
}

1voto

Adam Houldsworth Punkte 61593

1) Es ist für Kapselungsprinzipien, aber andere .NET-Funktionen verwenden Eigenschaften wie Datenbindung.

2) Ich bin mir nicht sicher, ob ich damit einverstanden bin, Ich habe immer gehört, dass, wenn die Eigenschaft ist eine gerade get / set seine genauso schnell wie ein Standard-Feld Zugriff - der Compiler tut dies für Sie.

更新しました。 scheint ein bisschen von beidem zu sein, kompiliert zum Methodenaufruf, ist aber JIT-optimiert. So oder so, diese Art von Leistungsproblem wird keine bedeutenden Auswirkungen auf Ihren Code haben. Beachten Sie jedoch, dass die Anleitung zur Implementierung von Eigenschaften darauf abzielt, sie so leicht wie möglich zu machen, da die Aufrufer nicht erwarten, dass sie teuer sind.

0voto

JSprang Punkte 11851

Nachdem ich die ce Post habe ich festgestellt, dass es im Grunde dazu dient, das Innenleben des Objekts zu verbergen.

0voto

JulianR Punkte 15805

Ich habe die dieselbe Frage vor.

Ich vermute, Sie sind mit VS2008, sind mit einem 64-Bit-Betriebssystem und haben Kompilierung auf "Any CPU" eingestellt? Wenn ja, werden Eigenschaften nicht vom x64 JIT-Compiler eingefügt. Sie tun auf 32-Bit, so dass sie in Leistung zu öffentlichen Feldern identisch.

0voto

user2310967 Punkte 265

Wenn Sie ein konkretes Beispiel für etwas suchen, wofür Eigenschaften benötigt werden und was Sie mit normalen Mitgliedsvariablen nicht tun können, denken Sie an die Vererbung: Wenn eine Klasse ein öffentliches Mitglied verwendet, können die Ableitungen dieser Klasse keine Validierung oder ein anderes Getter/Setter-Verhalten implementieren. Wenn sie etwas anderes tun wollen, müssen sie 1) die vorhandene Member-Variable ignorieren und eine neue Eigenschaft erstellen, 2) eine neue Eigenschaft hinzufügen und 3) jede Methode überschreiben, die die Member-Variable aufruft oder sich auf diese verlässt, um stattdessen die Eigenschaft zu verwenden. Dies bedeutet nicht nur unnötig mehr Arbeit, sondern kann auch fast unmöglich sein, wenn die Person, die die abgeleitete Klasse schreibt, keinen Zugriff auf den Quellcode hat.

Wenn die Basisklasse Eigenschaften anstelle von Mitgliedsvariablen verwendet, müssen Sie nur noch die Validierung oder ein anderes Verhalten zur get/set-Funktion hinzufügen, und schon sind Sie fertig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X