Forum: PC-Programmierung C++, C++/CLI, C# und .NET, MFC, WinAPI, die Qual der Wahl?


von Be B. (bebo)


Lesenswert?

Ich habe vor, mal wieder mit einem neuen Projekt zu beginnen, kann mich 
aber nicht so recht entscheiden, welche Kombination ich am besten Wähle.

Grundsätzlich gilt, eigenlich bin ich mit allen oben genannten 
Sprachen/Frameworks vertraut und ich könnte mein Projekt im Grunde in 
jeder Sprache/Framework realisieren.

Letztens habe ich mal einen Geschwindigkeitsvergleich zwischen C#, 
C++/CLI (managed/unmanged) und C++ (MFC) gemacht.

Da ich von umfangreichen Opperationen auf Arrays ausgehe, habe ich mal 
ein 1GB großes byte/unsinged char Array erzeugt, dieses gefüllt und 
einige einfache Opertionen durchgeführt und die Zeiten gemessen. 
Specherallokierung und freigabe lagen außerhalt meiner Meßschleife.

Hier war C++/MFC mit 1250ms/1350ms (64bit/32bit) ab schnellsten. (VS2008 
Std, Release version) C# war mit 2050ms ca 50% langsammer. Im managed 
mode brauchte die 32bit Version von C++/CLI genau so lange. Die 64 bit 
Version war etwas schnelle. Was mich allerdings erstaunt hat ist, daß in 
C++/CLI im unmanaged Mode deutlich langsammer war als im managed Mode. 
Zur Info, die komplette Schleife war entweder managed oder unmanaged. Es 
gab eine ständigen übergänge zwischen beiden Mode.

Eigentlich hätte ich ja erwartet, daß unmanged C++/CLI (also native C++ 
Klassen und deren Code) genau so schnell ausgeführt werden, wie C++/MFC, 
aber irgendwie ist das wohl nicht so. Weiß einer woran das liegen kann?


Die andere Frage, die ich mir stelle ist, soll ich .NET verwenden. Ich 
habe durchaus die Absicht das Programm vielleicht zu Verkaufen und da 
einen Kopierschutz einzubauen. Nach allem was man so über .Net 
Assemblies ließt, kann man die ja komplette zurückübersetzen. Klar ist 
das mit Sicherheit auch bei nativem Code möglich, aber wohl schwieriger 
als bei .NET. Oder kann man .NET Projekte auch vernünftig vor dem 
Zurückübersetzten schützen? Da das GDI+ auch in der MFC zur Verfügung 
steht, wäre das für mich eigentlich ok.

Hat schon mal jemand die Kontainerklassen von STL und .NET verglichen. 
Wie sieht es da mit der Geschwindigkeit beim Sortieren und Suchen aus?

Gibt es eigentlich Kommerzielle Produkte, welche auf .NET vertrauen? Ich 
meine nicht Büro, Verwaltungs oder Web Anwendungen, sondern eher so 
Dinge wie Textverarbeitungenssysteme, Videoschnitt, Bildbearbeitung, 
Datenbanken (Engine nicht Interface), CAD und CAM Software? Also reine 
Softwareprodukte die für Teuer Geld verkauft werden?

Ich könnte mir vorstellen, daß Hardwaredongles nicht lange Bestand 
haben, wenn man den Code so leicht Zurückübersetzen kann. Von daher ein 
klares nein zu .NET?

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Be Bo schrieb:
> Nach allem was man so über .Net
> Assemblies ließt, kann man die ja komplette zurückübersetzen.

Um einen Kopierschutz zu umgehen muss der Quelltext nicht komplett 
zurück-übersetzt werden. Es gibt .NET-Obfuscator, ich denke damit kriegt 
man zumindest die Funktions- und Variablennamen heraus.

Dongles sind einfach ein Pain-in-the-ass, für alle Beteiligten.

JEDE SOFTWARE KANN KOPIERT WERDEN!!! Wie kommst du auf die Idee, du 
könntest Softwarekopien besser unterbinden als die großen 
Spielehersteller?

von Be B. (bebo)


Lesenswert?

> JEDE SOFTWARE KANN KOPIERT WERDEN!!! Wie kommst du auf die Idee, du
> könntest Softwarekopien besser unterbinden als die großen
> Spielehersteller?

Ich komme nicht auf die Idee. Ich habe nur gelesen, daß mit .NET 
Reflector so einiges möglich sein soll. Gibt's da eigentlich auch was 
freies ohne Zeitbeschränkung zum Rumspielen?

> Dongles sind einfach ein Pain-in-the-ass, für alle Beteiligten.
Es ging nicht um Dongles, sondern um teure/aufwendige Software für den 
Massenmarkt, welche in .NET geschrieben ist.

Denn, wenn .NET so toll ist, warum benutzt das dann kaum ein großer 
Anbieter? Ich hatte mal ein Diktiergerät von Philips, da war die SW in 
.NET, aber das war's auch schon. Also auch wieder nur ein Utility und 
keine richtg große Software.

von Peter II (Gast)


Lesenswert?

Be Bo schrieb:
> Denn, wenn .NET so toll ist, warum benutzt das dann kaum ein großer
> Anbieter?

woran sieht du das es niemand nutzt. Ist doch eine exe wie jedes andere 
Programm auch. Und dem sieht man nicht sofort an ob es .net ist oder 
nicht.

Wenn das Programm eine umfangreiche Oberfläche haben soll, denn nutzt 
ich .net. Für consolenprogramm die viel rechnen soll und da auch noch 
schnell nehme ich c++.

In .net wird einem viel arbeit abgenommen, wo man in c++ erst viel 
irgendwelche libs braucht (datenbanken, imagebearbeitung )

Dein Geschwindigkeitsvergleich würde ich erstmal in frage stellen, es 
gibt viele was man in C++ und auch .net falsch machen kann. Wenn du das 
Programm nicht wirklich an die sprache angepasst hast, dann ist es kein 
wirklicher vergleich.

(bei .net z.b. for statt foreach).

von Be B. (bebo)


Lesenswert?

> woran sieht du das es niemand nutzt. Ist doch eine exe wie jedes andere
> Programm auch. Und dem sieht man nicht sofort an ob es .net ist oder
> nicht.
Na ja,
1) sieht man es, wenn man es installiert. Die Installer wollen dann auch 
die .NET Bibliotheken updaten. Außerdem steht es meißtens unter den 
Systemvorraussetzungen.
2) habe ich mir mal die Mühe gemacht und verschiedene Programme auf 
meinem Rechner auf ILDasm gezogen. Bis auf die Programme, von denen ich 
wußte, daß sie auf .NET basieren, konnte ILDasm die anderen Programme 
nicht öffnen.

Wenn .NET so toll wäre, dann müßten doch langsam auch mal große 
Softwarehäuser ihre Top-Applikationen auf .NET portieren. Damit würde ja 
die Entwicklung in Zukunft einfacher. Oder bringt denen das nichts, da 
sie die Funktionallität sowieso schon haben?

> Geschwindigkeitsvergleich
Nun ja, ich kann jetzt nicht behaupten, daß ich der große C# Experte 
bin, aber bei all meinen bisherigen Vergleiche waren die .NET varianten 
immer langsammer.
Ich hatte auch mal mit C++/CLI ein und die gleiche Text-Renderfunktion 
benutze. Einmal als Komponente des .NET Frameworks und einmal die WinAPI 
Versionen. Und auch dort waren Unterschiede. Selbst wenn die Funktionen 
nicht 100% Deckungsgleich waren, aber sie haben für mich sichtbar die 
selber Aufgabe erfüllt. Ein mal war .NET 6x langsammer und einmal sogar 
60x. Mag zwar fragwürdig sein, das so zu Vergleichen, aber für das 
Programm hätten alle 3 Funktionen funktionniert. Dabei war bei einer 
.NET Funktion die Ausgabe sogar schlechter.
Und dann ist mir aufgefallen, daß .NET Formulare relativ langsam sind. 
Ich habe mal 250 Buttons in ein .NET-Form geklebt und das Form 
gestartet. Dann habe ich 250 Buttons in ein MFC Dialog geklebt und 
gestartet. Auch hier war ein geschätzter Unterschied von 3-4x langsammer 
gegenüber C++/MFC zu erkennen.

Die Hauptfrage aber wäre: Warum ist unmanged C++/CLI Code (also C++) 
langsammer, als reiner C++ (native) Code. Und warum ist er sogar 
langsammer als managed C++/CLI Code. Oder optimiert der C++ Compieler 
hier nicht richtig? Ich hatte alle Speed Optimierungen aktiviert. Und 
der Block, den ich gemessen hatte war komplett im "#pragma unmanged" 
Block.

von eugler (Gast)


Lesenswert?

Be Bo schrieb:
>> Denn, wenn .NET so toll ist, warum benutzt das dann kaum ein großer
> Anbieter?

Autodesk, MS2010 u. MSVS2012, MSO 2010 ...

Wenn ich immer lese, das ".NET Geraffel", verstehe ich die Welt nicht 
mehr. Seltenst wurde uns Entwicklern soviel konform zu Tage. Mit dem 
Mono sogar Plattform unabhängig.

Die ewig Gestrigen werden sich noch wundern, wenn ihre IDE oder ihre 
Compiler Tools nur noch mit OS unterstützt werden, die bei Ebay einen 
scheine Schmott kosten. Anstelle von Atmel wäre langsam mal Zeit.

Ich hab nicht vor, einen Streit zu provozieren: aber wenn MS mit WIN8 
scheitert: lernt schon mal Objective-C. Und gewöhnt euch daran, das 
Atmel Studio 7 nicht mehr kostenlos ist.

von Peter II (Gast)


Lesenswert?

Be Bo schrieb:
> Wenn .NET so toll wäre, dann müßten doch langsam auch mal große
> Softwarehäuser ihre Top-Applikationen auf .NET portieren.

also in Firmenumgebungen kenn ich schon einige Anwendungen. 
(Zeiterfassung, Auftragswesen)

viele Anwendungen sind ja nicht neu und werden nicht komplett neu 
geschrieben. Es gibt keinen Grund eine C++ Anwendung die nur erweitert 
werden soll komplett neu zu schreiben.

> .NET varianten immer langsammer.
ja das ist ja ok, die frage wie viel langsamer sie sind. Dafür gibt es 
auch keine stack überschreiber und speicherzugriffsfehler.

> Dann habe ich 250 Buttons in ein MFC Dialog geklebt und
> gestartet. Auch hier war ein geschätzter Unterschied von 3-4x langsammer
> gegenüber C++/MFC zu erkennen.
naja in .net werden die button alle dynmaisch  an das Kontrol 
angehangen. MFC läuft da komplett anders.

von Be B. (bebo)


Lesenswert?

> (Zeiterfassung, Auftragswesen)
Das man kleine Tools und Helferlein in .NET schreibt, macht ja auch 
Sinn. Da wäre der Overhead mit WinAPI wohl zu groß.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Be Bo schrieb:
> Denn, wenn .NET so toll ist, warum benutzt das dann kaum ein großer
> Anbieter?

Weil es noch zu jung ist. Auch bei C++ haben erst nach etwa 10 Jahren
einige Pioniere unter den Softwarefirmen begonnen zu überlegen, Neuent-
wicklungen künftig in C++ statt in C zu entwickeln. Bis dann die ersten
wirklich großen Produkte in C++ auf den Markt kamen, dauerte es noch
einmal ein paar Jahre.

.NET/C# ist heute etwa 10 Jahre alt, wir sind also gerade in der Phase,
wo der eine oder andere Softwarehersteller sich Gedanken über einen
Umstieg macht. Das betrifft aber nur komplette Neuentwicklungen, für
bestehende Produkte oder bereits laufende Entwicklungen würde ein
Umstieg sehr viel mehr Kosten als Nutzen bringen. Vielleicht werden zu
Zeit tatsächlich Entwicklungen von Videoschnitt- oder CAD/CAM-Softwaren
gestartet. Mit dem Erscheinen entsprechender Produkte ist aber erst in
einigen Jahren zu rechnen.

Komplette Neuentwicklungen sind heutzutage allerdings sehr selten, weil
einfach die Kosten dafür zu hoch sind. Meistens wird auf Bestehendes
(also bspw. in C++ programmierte Bibliotheken und Frameworks) aufgebaut,
so dass es nicht sinnvoll ist die, Programmiersprache zu wechseln. Und
Zwischenlösungen wie C++/CLI stehen die meisten Entwickler recht skep-
tisch gegenüber, weil sie nur scheinbar einen weichen Übergang bieten.

Auch Java, das schon deutlich älter als .NET/C# ist, hat es nie so rich-
tig geschafft, außerhalb des Bereichs von Web-Anwendungen Fuß zu fassen.
Im Web trumpft es mit dem "Write-Once-Run-Anywhere"-Prinzip auf, was
aber in Arbeitsplatzumgebungen kein Vorteil, sondern eher ein Nachteil
ist. .NET/C# als der "bessere" Java-Nachfolger muss sich zunächst einmal
mit den gleichen Problemen herumschlagen und zusätzlich auch noch gegen
Java ankämpfen.

Auf breiter Basis durchsetzen wird sich .NET/C# — wenn überhaupt — wohl
erst dann, wenn sich die Generation der C++- und Java-Programmierer
allmählich zur Ruhe setzt. Aber wer weiß, ob bis dahin nicht schon die
nächste softwaretechnische Errungenschaft als Ablösung von .NET und C#
auf dem Plan steht.

@Be Bo:

Da du in der glücklichen Lage bist, mit vielen Alternativen (C++, C++/
CLI, C# und .NET, MFC, WinAPI) vertraut zu sein, würde ich an deiner
Stelle diejenige wählen, in der das Entwickeln am meisten Spaß macht.
Größere Projekte werden nämlich meist nicht durch fehlende Bleeding-
Edge-Softwareentwicklungstechnologien ausgebremst, sondern durch die
nachlassende Motivation der Entwickler.

Kleinere technische Probleme wie das zu leichte Reverse-Engineering beim
Einsatz von .NET als Plattform sind immer irgendwie lösbar und sollten
die Entscheidung nicht wesentlich beeinflussen. Falls ein Obfuscator
nicht ausreicht, kannst du immer noch die wirklich innovativen Teile
deiner Software (die meist nur einen kleinen Anteil an der Gesamtsoft-
ware haben) in einer Sprache schreiben, für die Native-Compilierung
möglich ist.

von Konrad S. (maybee)


Lesenswert?

Be Bo schrieb:
> Dann habe ich 250 Buttons in ein MFC Dialog geklebt

Wozu brauchst du 250 Buttons in einem Dialog? Unrealistische 
Test-Szenarien sind Zeitverschwendung.

Die Frage ist doch nicht, wie schnell es ist, sondern ob es schnell 
genug ist.
Für die Benutzeroberfläche kannst du nehmen, was du magst. Wenn du keine 
kapitalen Fehler einbaust, dann wird es schnell genug sein.
Wenn deine Rechenzeiten bei 2050ms für "große" Datenmengen liegen, musst 
du dir keinen Kopf machen.

eugler schrieb:
> Mit dem
> Mono sogar Plattform unabhängig.

(dezentes hüsteln)

von Arc N. (arc)


Lesenswert?

Be Bo schrieb:
> Denn, wenn .NET so toll ist, warum benutzt das dann kaum ein großer
> Anbieter? Ich hatte mal ein Diktiergerät von Philips, da war die SW in
> .NET, aber das war's auch schon. Also auch wieder nur ein Utility und
> keine richtg große Software.

Wenn .NET keine richtig große Software 1) ist oder VS2010 45 Mio SLOCs 
davon die Hälfte Managed Code 2) oder Dynamics CRM oder das Bing 
Front-End 3) oder Paint.NET oder auf Umwegen u.a. Office Web Apps 4), 
Sims3, Developer.Mozilla.org 5)
1) http://referencesource.microsoft.com/netframework.aspx zu faul zum 
Zählen
2) 
http://channel9.msdn.com/shows/Going+Deep/Rico-Mariani-Visual-Studio-Today-Tomorrow-and-Beyond/
3) http://channel9.msdn.com/Blogs/Charles/NET-45-in-Practice-Bing
4) http://projects.nikhilk.net/ScriptSharp/
5) http://www.mono-project.com/Companies_Using_Mono

Benchmarks: YMMV http://shootout.alioth.debian.org/

von Ahellwig (Gast)


Lesenswert?

Be Bo schrieb:

> Hier war C++/MFC mit 1250ms/1350ms (64bit/32bit) ab schnellsten. (VS2008
> Std, Release version) C# war mit 2050ms ca 50% langsammer. Im managed
> mode brauchte die 32bit Version von C++/CLI genau so lange. Die 64 bit
> Version war etwas schnelle. Was mich allerdings erstaunt hat ist, daß in
> C++/CLI im unmanaged Mode deutlich langsammer war als im managed Mode.
> Zur Info, die komplette Schleife war entweder managed oder unmanaged. Es
> gab eine ständigen übergänge zwischen beiden Mode.
>
> Eigentlich hätte ich ja erwartet, daß unmanged C++/CLI (also native C++
> Klassen und deren Code) genau so schnell ausgeführt werden, wie C++/MFC,
> aber irgendwie ist das wohl nicht so. Weiß einer woran das liegen kann?

Thunking, siehe beispielsweise:
http://de.wikipedia.org/wiki/Thunk
http://msdn.microsoft.com/de-de/library/ms235292.aspx

von Ahellwig (Gast)


Lesenswert?

Be Bo schrieb:
>> JEDE SOFTWARE KANN KOPIERT WERDEN!!! Wie kommst du auf die Idee, du
>> könntest Softwarekopien besser unterbinden als die großen
>> Spielehersteller?
>
> Ich komme nicht auf die Idee. Ich habe nur gelesen, daß mit .NET
> Reflector so einiges möglich sein soll. Gibt's da eigentlich auch was
> freies ohne Zeitbeschränkung zum Rumspielen?

ILSpy: http://wiki.sharpdevelop.net/ILSpy.ashx

von Be B. (bebo)


Lesenswert?

Yalu X.:
Ich habe mir jetzt mal die IDE von C# angesehen. Auch wenn ich nur das 
Std C# 2008 und die Express 2010 testen kann, muß ich zugeben, daß die 
.NET IDEs für c#/VBA um Welten besser sind, als die von C++(/CLI), 
leider :-(

Mal abwarten was das VS2012 mit sich bringt und ob es da ein günstiges 
Update von der Std Version gibt. Gab's ja letztes auch. Zumindest das 
neue C++ soll ja deutlich besser geworden sein.

Ansonsten beginne ich jetzt erst mal mit C#. Ich hatte auch mal über das 
MFC nachgedacht, aber da gibt's keine Dokumentation mehr und keiner 
weiß, wie es damit weitergeht.

Es ist ohnehin erstaunlich, daß es derzeit für native 
Windowsprogrammierung keine vernünftige Tools mehr gibt. Alles was man 
findet scheint 10 Jahre alt zu sein. Und so etwas wie den Petzold zu 
Win95 gibt's für Win7 / Windows 8 auch nicht mehr. Ist schon irgendwie 
schade.
Dabei sieht man doch bei der GDI++ Bibliothek, daß es möglicht ist 
einfachen Syntax und Top Performance unter einen Hut zu bekommen.

@Konrad S.:
250 Control war nur zum testen. Real ist  mir das mal aufgefallen, als 
ich ein Programm geschrieben haben, daß direkt beim Starten 6 Fenster 
mit durchschnittlich je 100 Custom Controls geladen hat. Das war das 
reinsten Pixelgewitter. Es hat ca. 3 Sekunden gedauert, bis alles 
aufgebaut war. Anfangs dachte ich, daß das an den umfangreichen 
Zeichenoperationen in meinen CustomControls lag. Also habe ich einfach 
mal ein Form generiert und eine ähnliche Anzahl enfacher Button 
hineingeklebt. Ergebnis: Es lag nicht an meinen CustomControls, sondern 
an .NET. Das witzige daran war, daß die CPU garnicht unter Volllast 
lieft. Im Grunde hätte es also schneller von statten gehen können. Bei 
nativer Windows Programmierung ist mir das noch nie so stark 
aufgefallen.

@Ahellwig:
Ich habe mir gerade mal mit ILSpy den Code meinem Test C# Programm 
angesehen. Das ist ja erschreckend, wie nah die Darstellung an den 
orginal Quelltext heranreicht. Nach dem ich das ganze dann mal mit dem 
Dotfuscator, der im VS-2008 enthalten ist, geschickt habe, sah es dann 
schon etwas besser aus. Zwar habe ich die Codekonstruktionen alle 
wiedergefunden, aber ohne aussagekräftige 
Class/Funktions/Variablen-Namen war nicht mehr gleich auf Anhieb klar, 
was das Programm machen sollte. Nur sollte man möglichst keine 
konstannten Strings verwenden, da die dann wieder etwas verraten. Leider 
erkennt man welche Assemblies verwendet wurden. So sieht man sofort, wo 
sich Forms/Controls verstecken.

Leider funktionniert der Dotfuscator nicht bei Mixed-Mode Code.

Was das Thunking angeht ist mir schon klar, daß der Datenaustausch 
zwischen beiden Welten Overhead mit sich bringt. Ich habe die 
Zeitmessung allerdings komplett in einer Nativen Klassen-Funktion 
durchgeführt, die mit den #pragmas unmanaged/managed umgeben war. 
Innerhalb der Funktion sollte da doch nun wirklich alles native laufen, 
oder? Einstellung war /clr.

von Mark B. (markbrandis)


Lesenswert?

Yalu X. schrieb:
> Auch Java, das schon deutlich älter als .NET/C# ist, hat es nie so rich-
> tig geschafft, außerhalb des Bereichs von Web-Anwendungen Fuß zu fassen.

Da gibt es schon so einiges, was nicht web-spezifisch ist.
Ich würde z.B. eclipse und Netbeans sehr wohl als erfolgreich 
bezeichnen. Teile von MATLAB und Lotus Notes und OpenOffice sind in Java 
geschrieben, dann die ganzen Android Apps, die SAP setzt Java ein, dann 
wäre da noch SPSS, Maple ist zum Teil in Java geschrieben, OSGi 
verwendet Java, MagicDraw ist in Java geschrieben, ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.