2009-08-15 14 views
3

Ich habe folgende Fragen:Performance: Kompilieren in VS, Run in Mono auf Windows und Linux

  1. Ist es möglich, ein C# Projekt mit VS.NET, zu kompilieren und auf Mono laufen?
  2. Gibt es Leistungsvorteile im Zusammenhang mit Ansatz 1 (vs Kompilieren mit dem Mono-Compiler)?
  3. Was ist mit dem Ausführen der Ausgabe .exe/.dll auf Linux? Und was sind die damit verbundenen Leistungsmerkmale?

Dank

+1

Mit mono können Sie die AOT (Ahead Of Time) Compilation verwenden. Dadurch werden Ihre .NET-Assemblys (mit IL-Code) in nativen Code wie dem von C++ oder C erstellten Code kompiliert, was eine schnellere Startzeit, eine bessere Speicherleistung und möglicherweise eine bessere Gesamtleistung ermöglicht. Es funktioniert jedoch nur auf der Betriebsumgebung (OS + x86/x64), auf der es kompiliert wird. http://www.mono-project.com/AOT –

+0

Danke für diese Info. – jameszhao00

+0

@C Rogers - so ein bisschen wie NGEN (nur vielleicht mit der GAC); -p –

Antwort

8
  1. Ja, Sie können das tun. Es sollte funktionieren, wenn der Code einige Framework-Elemente verwendet, die nicht auf Mono implementiert sind.

  2. Nicht dass ich mir dessen bewusst bin.

  3. Nicht sicher, was der Unterschied zwischen # 3 und # 1 ist. Wenn Sie mono zum Kompilieren unter Windows verwenden und es dann auf Linux portieren, sollte es immer noch genauso funktionieren. Beide Compiler erzeugen im Wesentlichen den gleichen IL-Code.

1

Ich weiß nicht, über die Leistung aber this article versucht zu zeigen, wie die MonoDevelop-Tool unter vs. kompilieren Dies sollte Ihnen eine Idee geben, was die Unterschiede sind.

6

1:
Ja. Die Compiler kompilieren in IL-Code, der in jedem System ausgeführt wird.

Nicht jede Bibliothek ist in Mono implementiert, aber diejenigen, die funktionieren, sollten nahtlos funktionieren. Außerdem hat der Code geschrieben werden independend des Systems werden richtig zu arbeiten, zum Beispiel:

  • Verwenden Path.DirectorySeparatorChar und Path.Combine zu Dateipfade zu bilden, anstatt die Stringliteral "\" oder "/" verwenden.
  • Verwenden Sie die BitConverter-Klasse, um eine Byte-Manipulation durchzuführen, die unabhängig von Big-Endian/Little-Endian-Architektur ist.

2:
Möglicherweise gibt es einige Unterschiede in welchem ​​Code werden die Compiler generieren, aber wie fast alle Optimierung wird durch den JIT-Compiler durchgeführt, die nur selten messbaren Unterschied machen sollte.

3:
Die EXE- und DLL-Dateien enthalten keinen systemeigenen Code, sie enthalten IL-Code. Der native Code wird vom JIT-Compiler generiert, wenn die exe/dll geladen wird.

+0

Ich denke, die EXE/DLL enthalten CLR loader/binders. – jameszhao00

2

Um auf andere Antworten zu erweitern:

Für Punkt 3. Ja, es wird ein Unterschied in der Leistung sein, wenn MSCLR vs Mono verwenden, und nein, ich weiß nicht, was es sein wird. Vielleicht ist nichts, vielleicht ein kleiner oder vielleicht sogar ein viel schneller - Sie müssen Ihre spezifische Anwendung profilieren.

Beachten Sie auch, dass trotz der Geschwindigkeit des Codes durch den JIT-Compiler die Bibliotheken sehr unterschiedlich implementiert werden und mit hoher Wahrscheinlichkeit unterschiedliche Leistungsmerkmale haben werden.

Wenn Sie beabsichtigen, Ihre Anwendung unter Mono zu unterstützen, müssen Sie dort Leistungstests sowie MS CLR ausführen.