Nach meinem Wissen ist Monomorphismus ein sehr ungewöhnlicher Begriff. Ich habe persönlich nie gehört, dass es zum Codieren verwendet wurde. Um herauszufinden, was der Monomorphismus ist, können wir jedoch schlussfolgern, was es bedeutet, wenn wir uns ansehen, was Polymorphismus ist.
Polymorphismus: ist die Idee, dass viele (Poly-) verschiedene Objekte vom gleichen Typ zur Maschine/Laufzeit/Interpreter dargestellt werden können. Zum Beispiel können Sie in C# beliebig viele Klassen implementieren, die ICloneable
implementieren, und alle davon könnten in einem Kopierkonstruktor für eine generische verkettete Liste verwendet werden (zum Beispiel). Full un-tested class here as an example if you're interested
Ok also was bedeutet monomorph?
Monomorph zu mir bedeutet, dass der Interpreter des Objekts den EXACT-Typ verarbeitet, den er erwartet, und keine Vererbung oder Änderungen des erwarteten Typs möglich ist. In diesem Kontext, mit der Ente typisierte Javascript-Sprache, sagt die VM "dieses Javascript-Objekt hat diese genaue Eigenschaften, die von diesen genaue Typen sind und genau genannt werden, wie sie sind". Wenn wir in C# monomorph sein wollten, wären generische Typeinschränkungen unmöglich, weil T
immer die gleiche Art sein müsste.
This link bietet eine gute Anleitung, warum dies für die Leistung wichtig ist. Zu mir kann das unten zusammengefasst werden.
Javascript-Engines möchten Tabellen-Lookups für Eigenschaften vermeiden und stattdessen Objekt-Zeiger-Offsets ausführen. Beim Monomorphismus sind die Objekt-Offsets für Objekte in einer gegebenen Codezeile immer gleich, und die VM kann leicht herausfinden, wie Lookups mit Pointer-Addition statt mit Tabellen-Lookups durchgeführt werden.
In Wirklichkeit versuchen die Engines eine kleine Anzahl verschiedener Objekte zu bearbeiten, die an dieselbe Funktion übergeben werden, aber die VM wird am schnellsten, wenn das Objekt in derselben Codezeile immer gleich aussieht.
Beispiel zur Klarheit
Das folgende Beispiel gilt JavaScript, aber das Argument o
f1
funktionieren NICHT monomorphe wird, weil die VM zwei zu handhaben muss, unterschiedlich geformte Gegenstände übergeben werden.
function f1(o) {
console.log(o.prop1)
console.log(o.prop2)
}
// ...
o1 = { prop1: 'prop1', prop2: 'prop2' }
o2 = { prop1: 'prop1', prop2: 'prop2', prop3: 'prop3' }
f1(o1)
f1(o2)
Der Punkt des Angebots von der Verbindung, die Sie zur Verfügung gestellt haben, ist, dass AngularJS out-of-the-box-Code zur Verfügung stellt h macht alle seine JavaScript-Funktionsargumente "monomorph", weil die Objekte, die in sie übergeben werden, jedes Mal die gleiche Struktur haben, wenn sie aufgerufen werden.
Obligatary lesen: http://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html (erste Google-Hit, BTW) – Bergi