Frage

Ich habe eine C # Schnittstelle mit bestimmten Verfahrensparameter wie object Typen deklariert. Jedoch bestanden die tatsächliche Art der Umgebung kann die Umsetzung von der Klasse unterscheiden sich in Abhängigkeit der Schnittstelle:

public interface IMyInterface
{
    void MyMethod(object arg);
}

public class MyClass1 : IMyInterface
{
    public void MyMethod(object arg)
    {
        MyObject obj = (MyObject) arg;
        // do something with obj...
    }
}

public class MyClass2 : IMyInterface
{
    public void MyMethod(object arg)
    {
        byte[] obj = (byte[]) arg;
        // do something with obj...
    }
}

Das Problem mit MyClass2 ist, dass die Umwandlung von byte[] zu und von object ist Boxen und Unboxing , die rechnerisch teure Operationen Leistung zu beeinträchtigen.

Würde die Lösung dieses Problems mit einer Boxen / Unboxing vermeiden ?

public interface IMyInterface<T>
{
    void MyMethod(T arg);
}

public class MyClass1 : IMyInterface<MyObject>
{
    public void MyMethod(MyObject arg)
    {
        // typecast no longer necessary
        //MyObject obj = (MyObject) arg;
        // do something with arg...
    }
}

public class MyClass2 : IMyInterface<byte[]>
{
    public void MyMethod(byte[] arg)
    {
        // typecast no longer necessary
        //byte[] obj = (byte[]) arg;
        // do something with arg...
    }
}

Wie wird dies in .NET vs Mono implementiert? Wird es auf jeder Plattform keine Auswirkungen auf die Leistung sein?

Danke!

War es hilfreich?

Lösung

Ich bin mir nicht sicher, wie es in Mono implementiert ist, aber generische Schnittstellen helfen, da der Compiler für jede andere Art verwendet, um eine neue Funktion des speziellen Typs erzeugt (intern, gibt es einige Fälle, in denen es das gleiche nutzen kann erzeugte Funktion). Wenn eine Funktion des bestimmten Typs erzeugt wird, gibt es keine Notwendigkeit zu Feld / den Typ unbox.

Aus diesem Grunde ist die Collections.Generic Bibliothek ein großer Hit bei .NET 2.0 war, weil Sammlungen nicht mehr erforderlich Box und wurde deutlich effizienter.

Andere Tipps

Sie werden die gleichen Vorteile in Mono, die Sie in .NET tun.

Wir empfehlen dringend, dass Sie Mono verwenden 1.9 oder Mono 2.0 RCx im Allgemeinen als Generika nur mit 1,9 gereift unterstützen.

  

Das Problem mit MyClass2 ist, dass die   Umwandlung von byte [] zu und von   Objekt ist Boxen und Unboxing, die   rechnerisch teuer sind   Operationen Leistung zu beeinträchtigen.

Es gibt keine Boxen mit Array-Typen beteiligt, auch einen mit dem Werttyp-Elementen. Ein Array ist ein Referenz-Typ.

Der Overhead auf (byte []) arg ist bestenfalls minimal.

Ja, in .Net (MS nicht sicher mono) Generika sind bei der Kompilierung durchgeführt, so dass keine Boxen oder Unboxing ist überhaupt los ist. Im Gegensatz zu Java-Generika, den syntaktischen Zucker sind, die nur die Würfe führen für Sie im Hintergrund (zumindest war es auf diese Weise einmal). Das Hauptproblem bei Generika ist, dass Sie nicht generische Container polymorph behandeln kann, aber das ist ein bisschen off Ihr Thema: -)

Ich kann nicht auf Mono sprechen, aber eine generische Schnittstelle mit sollte löst das Boxen / Unboxing-Problem in der MS-Laufzeit.

Da Sie eine aktuelle Version von Mono verwenden, 2.0, wenn Sie können.

Allgemeine Schnittstelle Leistung auf Mono ist sehr gut, auf ein Paar mit regelmäßigem Schnittstelle Versand.

Der Versand von Generika virtuellen Methoden [1] auf alle freigegebenen Versionen von Mono schrecklich, es in 1,9 du verbessert hat.

Das Problem ist nicht so schlimm wie das Performance-Problem mit generischen virtuellen Methoden ist für die nächste Version von Mono (2.2) festgelegt worden, die bis zum Ende dieses Jahres geplant ist.

[1] Eine generische virtuelle Methode ist so etwas wie:

public interface Foo {

  void Bla<T> (T a, T b);

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top