Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 02, 2025 00:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 47 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: C# für Java-Devs
BeitragVerfasst: Do Jan 12, 2012 17:50 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Gut das der Thread jetzt abgetrennt wurde.
Ich diskutiere dann mal weiter: ;)

Zitat:
Schau mal in MonoTouch und Mono, da bist du froh wenn...

Ich muss gestehen das ich mich noch mit keinen von beiden auseinandersetzen, wobei ich von "MonoTouch" noch nicht mal was gehört habe. Liegt wohl daran weil mich diese Mobilen Plattformen nicht interessieren.
Ich beschränke mich eigentlich auf Windowsentwicklung. Habe eh nichts anderes. ;)

Zitat:
keine Abortmethode von Thread nutzten kannst...

Wenn ich das richtig in Erinnerung habe ist die Methode als "veraltet" markiert.
Zumnindest wollt ich die mal nutzen, habe dann aber aus dem Grund lieber einfache Abbruchvariablen eingeführt.

[quote]Selbst der aktuelle VC# compiler tut nicht mal schleifen entrollen, SIMD oder neuere cpu instructions optimieren.[\quote]
Das ist allerdings übel. Besonders weil Microsoft immer damit wirbt das ein .Net Programm besonders stark optimiert werde, weil die Zielplattform bekannt ist.

[quote]Mit den 30 Threads hast du falsch verstanden..[\quote]
Ich habe hebe gemeint das ich selber maximal 3 Parallethreads erzeugt habe.
Das der Threadpool viele Threads erzeugt, ist eigentlich klar. Dafür gibts denn ja.
Ich habe denn aber noch nie verwendet. Allerdings habe ich schonmal etwas vergleichbares selber implementiert.



Ich merke das wir scheinbar mit C# vollkommen verschieden Sachen machen wollen\müssen.

Eine Sache die mir in C# häufiger abgeht ist eine gescheite Mehrfachvererbung.
Ich habe nämlich schon manchmal Code doppelten(oder noch häufiger) Code in meiner Anwendung gehabt, weil ich als Workaround Interfaces nutzen musste.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C# für Java-Devs
BeitragVerfasst: Do Jan 12, 2012 19:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
OpenglerF hat geschrieben:
Das ist ein Problem welches ich als masslos überschätzt ansehe.
Wie gesagt, ich habe mal ein ein Spiel programmiert und das war hinreichend schnell, obwohl ich einen Programmierstill draufhatte, das es der Sau graust. (Zb. habe ich damals (war noch vb.net) keine list verwendet, sondern immer Arrays mit "Redim" verkleinert oder vergrößert.)

Code:
  1. TimeSpan now=new TimeSpan(DateTime.Now.Ticks);
  2. float deltaTime=(float)(now-lastTime).TotalSeconds();
  3. if (now<NextRound){.... NextRound=now+PhysicFixedDelta;}

Sowas hat man in einer Update Loop drin und läuft bei vsync auf iPad mit 30Hz und auf PC mit 60Hz, sollte man aber vsync abschalten dann kann man auf dem PC auch mal 1000Hz und mehr haben.
Rennspiele z.B. lassen die Physik mehrere hundert mal die Sekunde laufen(um stabile simulationen zu liefern) und da liegt auch so ein Code davor. Der Timer von .Net macht intern auch nix anderes.
Unter Mono war DateTime.Now recht lange optimiert gewesen, indem man nur alle paar ms ein neuen system call gemacht hat und solange den alten wert zurück gab. Aktuell wird aber bei jedem Now ein systemcall gemacht und ein neues DateTime erzeugt und natürlich kommen noch die TimeSpan dazu.
Sicher nicht das größte Problem, im vergleich zu Algos die noch laufen und mit memoirs pattern kann man noch ein bisschen reduzieren aber das passiert halt an ein paar mehr stellen und wenn man das in realtime macht hat es auf mobile größere auswirkungen.

Zitat:
Das hingegen ist nachweißlich ziemlicher Blödsinn. Seis auch nur wegen dem umfangreichen Framework.

Leider doch, bestes Beispiel ist Lineare Algebra. C# macht fast alles auf dem Heap und der ist um ein vielfaches langsamer als der Stack. Da aber C++ mir die wahl lässt, ob ich ein objekt auf dem Heap oder Stack packe, tu ich das natürlich auf dem Stack und ich musst dafür nix machen als ledeglich nicht new zu verwenden, denn die temporären Objekte werden sowieso auf dem Stack erzeugt.

Zitat:
Das die Listentype im eigentlichen Sinne zum Framework und nicht zu C# gehören ist schon klar.
Das Framework wurde aber wiederrum selbst großteils mit C# programmiert und zu 90% von C#-Programmierern verwendet.

Das raffe ich nicht, QT, Boost, STL und so weiter basieren doch auch auf C++ und STL nutzt wirklich jeder C++ programmierer und Boost nutzten viele die nicht um komplexere Klassenmechaniken und wenig Entwicklungszeit drum rum kommen. Da hab ich wohl irgendwie den Faden verloren.

Zitat:
Wenn ichs besser beherrschen würde, würd ich auch zb. Spiele ausschliesslich in C++ entwickeln.
Aber das für eine typische Windowsanwendung mit (umfangreicher) GUI das selbe Ergebnis mit C# wesentlich schneller zu erreichen ist als mit C++ kann wohl keiner abstreiten.

Jupp.

Zitat:
Da er weiß das es Generics gibt, ist dem aber nicht so.
Teilweiße habe ich aber auch denn Eindruck das so manches Vorurteil aus der Zeit stammt.
Er ist halt noch einer "der alten Cplusplusler". Beidenen C++ das einzige ist, was was taugt.
(Wobei es da noch viiieeeeeeeel schlimmere gibt. ;))

Delphi, FreePascal/C/Java, C++/C#, ist die reihenfolge von Sprachen die ich länger als 2Jahre benutzte habe, nicht das der Eindruck entsteht, ich mag nur C++.
Sicher meine Erfahrung mit C++ ist wesentlich größer als mit C# aber selbst in C# hab ich schon an 2 Spielen in 2 größeren Studios mitgearbeitet. Allerdings ist der Umfang von .Net wesentlich größer und daher kenn ich auch nicht jeden kniff.
Die Probleme die ich genannt habe wird man wohl auch kaum in Office Tools bemerken, alleine weil die Hardware zig mal schneller ist und im Bereich Speicher der um längen schneller ist(so ein 1600MHz ddr3 speicher ist einfach wesentlich schneller als ein 200Mhz LPDDR Riegel).
Daher werden sich auch viele wundern, wieso ich mir um solche low level Probleme ärger.

Wie schon mehrmals gesagt wurde ist C# nicht für Spieleentwicklung ausgelegt, sonnst würden die Studios auch das kostenlose XNA nutzten und nicht das teuere C++ SDK für XBox360 kaufen. Denn Lizenztechnisch kann damit gleiches erzielt werden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: C# für Java-Devs
BeitragVerfasst: Do Jan 12, 2012 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
OpenglerF hat geschrieben:
Eine Sache die mir in C# häufiger abgeht ist eine gescheite Mehrfachvererbung.
Ich habe nämlich schon manchmal Code doppelten(oder noch häufiger) Code in meiner Anwendung gehabt, weil ich als Workaround Interfaces nutzen musste.


Das vermisse ich auch sehr, da ich in C++ mir angewöhnt hatte Policy und Idioms Pattern zu verwenden und einige auch auf vererbung beruhen.
Die Lösung für das Problem, die ich verwende ist eine Instanz als member an zu legen und dann in der Klasse alle Funktionen vom Interface auf den member wrappe. Damit hab ich zwar immer noch ne menge Tipparbeit, wegen dem Interface aber ich kann mir sicher sein, dass der echte Code nur einmal im Projekt vor kommt und wenn dieser Bugfrei ist, dann ist er es in allen Klassen und das refactoring ist natürlich wesentlich einfacher.

Man hat natürlich auch ne menge mehr Interfaces und Klassen im Projekt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 12, 2012 20:23 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
TimeSpan now=new TimeSpan(DateTime.Now.Ticks);
float deltaTime=(float)(now-lastTime).TotalSeconds();
if (now<NextRound){.... NextRound=now+PhysicFixedDelta;}

Ist ja schön und gut, aber ich würde da direkt einen PerformaceCounter nehmen, statt mich damit rum zu ärgern. (System.Diagnostics.StopWatch)

Zitat:
Unter Mono war DateTime.Now recht lange optimiert gewesen, indem man nur alle paar ms ein neuen system call gemacht hat und solange den alten wert zurück gab.

Gerade in der 3D-Grafik\Physik denke ich kommt es zu deutlichen unregelmässigkeiten wenn einfach ein paar Millisekunden lang der alte Wert weiter benutzt wird. Die "DeltaTime" ist schliesslich ein float und somit sehr genau.

Zitat:
Leider doch, bestes Beispiel ist Lineare Algebra. C# macht fast alles auf dem Heap und der ist um ein vielfaches langsamer als der Stack...

Irgendwie hat das nichts damit zu tun das man viele Sachen unter C++ schneller zusammenbekommt als mit C#. (Codemehraufwand nanntest du es.)
Für unglaublich viel gibt es bereits vorgefertigte Klassen.
Wo man in C++ sich noch mit Systemaufrufen rumgeärgert hat, gibt es C# schon passende Wrapper.
Und nichtsdestotrotz muss man in C++ viel sorgfältiger Arbeiten, da man insbersondere in der Zeigerarethmetik ganz leicht vertut.

Zitat:
Delphi, FreePascal/C/Java, C++/C#, ist die Reihenfolge von Sprachen die ich länger als 2 Jahre benutzte habe.

Meine Reihenfolge:
VBA -> VB.Net -> C#(-> C -> C++\D)
Ich bin im Vergleich dazu ein relativ junger Programmierer.
C habe ich vorallendingend im Bereich der Mikrocontroller benutzt. Am PC eher weniger.
Ich intressiere mich aber theortisch schon seit langem für C++.
Wobei ich in C++ trotz zahlreicher Bücher und Online Tutorials nie denn richtigen Einstieg gefunden habe.
Was mich an C++ sehr stört: (Fällt mir spontan ein)
-Für jeden Krimskrams braucht man schon Zeiger. (Man denke an ein einfaches Array.)
-Diese Präprozessor Includes habe ich bis heute nicht durchschaut. Sowas wie #pragma once nervt.
-Unmengen an Compilereintellungen. Will man eine Bibliothek hinzufügen, reicht es nicht die passende Datei auszuwählen, sondern man muss sich mit zig Sachen umstellen.

Das das alles für einen alten C++ Guru kein Problem ist, weiß ich auch. Nur ich kann mich damit nicht anfreunden.
In C++ habe ich das Gefühl unentwegt gegen die Sprache ankämpfen zu müssen. :(
Dauert funktioniert auch irgendetwas nicht so wie es soll.

Deshalb habe ich mir mal D(das bessere C++ ;)) angeschaut.
Blöd ist da nur, das es da halt wieder keine Bibliotheken mehr gibt. :(
Schon OpenGL einzubinden ist nicht so ganz einfach. C++ Bibliotheken gehen gar nicht richtig.



Zitat:
Das vermisse ich auch sehr, da ich in C++ mir angewöhnt hatte Policy und Idioms Pattern zu verwenden und einige auch auf vererbung beruhen.
Die Lösung für das Problem, die ich verwende ist eine Instanz als member an zu legen und dann in der Klasse alle Funktionen vom Interface auf den member wrappe. Damit hab ich zwar immer noch ne menge Tipparbeit, wegen dem Interface aber ich kann mir sicher sein, dass der echte Code nur einmal im Projekt vor kommt und wenn dieser Bugfrei ist, dann ist er es in allen Klassen und das refactoring ist natürlich wesentlich einfacher.

Auch ne gute Idee.
Nur dann wieder umständlich wenn man dem Interface neue Funktionen hinzufügen will.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 12, 2012 20:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
du kannst deine lineare algebra implementationen auch auf dem stack laufen lassen, dafür gibts structs und stackalloc oder fixed.... und wer auf schmerzen steht kann auch wieder seine geliebten pointer einschalten und so weiter... aber bei c# gehts eh nicht um performance... sondern um die leichtigkeit des seins wenns ums entwickeln von business oder einfachen kleinen klickibunti dingern geht. :)

ich schreibe mein weltallmmo auch mit c++/dx11 und nicht mit c#/xna/tao


zum glück kann ja jeder frei wählen was er zum programmieren nehmen möchte :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 12, 2012 20:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
C# und Games sind sonne Sache für sich, mir persöhnlich ist es noch nicht untergekommen das C# dafür nicht genug Leistung bringt (ich kann aber auch als Privatmensch schlecht auf über Grafik und sonstewas setzen ^^). Es gäbe aber die Möglichkeit C# (oder andere .Net Sprachen) sehr leicht mit Nativecode zu kombinieren. Früher habe ich das sehr oft gemacht um z.B. WPF mit vorhanden Allegro oder OpenGL kram zu kombinieren oder um einige dumme Kacke auf die ich kein Bock hatte zu umgehen :P.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 13, 2012 00:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zitat:
Irgendwie hat das nichts damit zu tun das man viele Sachen unter C++ schneller zusammenbekommt als mit C#. (Codemehraufwand nanntest du es.)
Für unglaublich viel gibt es bereits vorgefertigte Klassen.
Wo man in C++ sich noch mit Systemaufrufen rumgeärgert hat, gibt es C# schon passende Wrapper.
Und nichtsdestotrotz muss man in C++ viel sorgfältiger Arbeiten, da man insbersondere in der Zeigerarethmetik ganz leicht vertut.

In C++ gibt es für alles Bibliotheken aber sie sind nicht in einer großen Sammlung, wie .Net, verfügbar.
Wenn man ein Exchange-Server anquatschen wil, dann findet SourceForge schon zig libs und kaum eine sieht wie die andere aus, weil jeder sich was anderes dachte, was wichtig wäre(Perf, Usability, wenig Dependencies, einfache erweiterbarkeit ...).
So verhält es sich für alles Themen, nach gut 33Jahren verfügbarkeit von C++ kommt halt ne menge rum.
Da viele alles aus einem Guß haben wollen, wenn sie nicht gerade low level programmieren wollen aber nicht auf Java oder C# entwickeln wollen, dann nutzten diese oft QT.

Zitat:
Was mich an C++ sehr stört: (Fällt mir spontan ein)
-Für jeden Krimskrams braucht man schon Zeiger. (Man denke an ein einfaches Array.)
-Diese Präprozessor Includes habe ich bis heute nicht durchschaut. Sowas wie #pragma once nervt.
-Unmengen an Compilereintellungen. Will man eine Bibliothek hinzufügen, reicht es nicht die passende Datei auszuwählen, sondern man muss sich mit zig Sachen umstellen.

Das Pointer genutzt werden, ist ein C ding, weil ne API über Referenzen zu machen, müsste man ja für jeden Typ eine Implementierung anbieten und templates gibt es erst mit C++. Wenn in C++ noch Pointer rum schwirren ,dann liegt es daran, dass man die API einfach halten wollte und den Pointer gleich noch als Bool missbraucht.
Code:
  1. void* GetItem(int Index);// return 0 if Index is out of bound else the pointer of the Item

Exceptions sind in C++ total langsam, da C++ nicht dafür designed wurde. Man findet deswegen sehr sehr viele Frameworks/Libs die exceptionless sind und mit Errorcodes oder solchen Pointer Tricks arbeiten.
Bei C# sind Exceptions super schnell und da kann man um sich werfen ohne sich groß sorgen zu machen.

Reference von C# ist wirklich einfacher als das linken von Libs bei C++.
Um ein ähnliches System zu machen, müsste man die Libs zur Laufzeit linken und nicht beim linken der Executable und dann bräuchte die Lib RTTI und sowas gibt es nicht in ausreichender Form.
GCC kann etwas ähnliches, da GCC C++ Shared Libraries produzieren kann und wenn man dann die dll/so lädt und die Header von der Lib hat, kann man die auch so nutzten als ob diese eine Reference von C# wäre.
Das Feature hat sich nicht durch gesetzt, weil für Shared Libs ja ein Name mangling gebraucht wird und das ist in C++ nicht standardisiert, deswegen muss man auch C dll/so programmieren, weil es bei C standardisiert ist.
Du kannst dir also nicht sicher sein, dass GCC ne VC++ dll versteht und leider nicht mal davon ausgehen, dass die alte GCC kompilierte DLL von ein neuen GCC verstanden wird und deswegen nutzt so ziemlich niemand C++ Shared Libs.

Zitat:
du kannst deine lineare algebra implementationen auch auf dem stack laufen lassen, dafür gibts structs und stackalloc oder fixed.... und wer auf schmerzen steht kann auch wieder seine geliebten pointer einschalten und so weiter... aber bei c# gehts eh nicht um performance... sondern um die leichtigkeit des seins wenns ums entwickeln von business oder einfachen kleinen klickibunti dingern geht. :)

Jupp sowas hab ich auch und wollte es verwenden aber leider muss man dann die entsprechenden Methoden unsafe marken und leider verbietet Unity3D für Browser Plugin unsafe Code :.(
Mal gucken, wann ich Zeit hab aber ich werde ein Wrapper schreiben, der für Web ne Software Variante nutzt, in standalone die Unity3D Klassen und für Server werde ich die Mono.SIMD.Math Klassen nutzten.

Zitat:
C# und Games sind sonne Sache für sich, mir persöhnlich ist es noch nicht untergekommen das C# dafür nicht genug Leistung bringt (ich kann aber auch als Privatmensch schlecht auf über Grafik und sonstewas setzen ^^). Es gäbe aber die Möglichkeit C# (oder andere .Net Sprachen) sehr leicht mit Nativecode zu kombinieren. Früher habe ich das sehr oft gemacht um z.B. WPF mit vorhanden Allegro oder OpenGL kram zu kombinieren oder um einige dumme Kacke auf die ich kein Bock hatte zu umgehen :P.

Das empfehle ich auch jeden, leider arbeite ich mit Unity3D und das Web Plugin verbietet das laden eigener Bibliotheken.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 13, 2012 00:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich will noch ein Wort zu Pointer bei C++ los werden. Am Anfang nutzten die Entwickler oft Pointer aber mit der Zeit lernen die Entwickler das RAII Pattern kennen und dann packt man den Pointer in ein Container. Solche Container kennt man als SharedPointer, SmartPointer, ReferenceCounterPointer und so weiter.
Es gibt da diverse, da diese unterschiedliche verhalten haben.
Ich benutze in mein c++ Framework 2 solcher Container, AutoPointer und AutoPointerArray(pointer auf ein array muss ja per delete[] ptr freigegeben werden).
Folgender Code ist aus einem UnitTest von meiner Array Klasse und der Array, der von FindAll zurück kommt wird freigeben, sofern er nicht 0 ist, sobald der Scope verlassen wird oder das Ownership an ein anderen Container übergeben wurde.
Code:
  1.         Bool FindAll()
  2.         {
  3.             Array<UInt32> vec(3);
  4.             vec.Item(0,3);
  5.             vec.Item(1,2);
  6.             vec.Item(2,3);
  7.             AutoPointer<Array<UInt32> > results=vec.FindAll(MakeDelegate(this,&ArrayTest::FindThree));
  8.             return results && results->Count()==2;
  9.         }

Prinzipiell versuche ich in C++ möglichst Threading- und Pointer-Bugs auf kosten von Performance zu mindern.
Erst, wenn keine Optimierung mehr an anderen Stellen geht greif ich bei den beiden Themen ein.
Denn diese beiden Arten von Bugs können sehr sehr viel Zeit in Anspruch nehmen, wenn man diese Debuggen muss.
Diese Zeit steht eigentlich nie im Verhältnis zu der benötigten Zeit ein anderen Teil in der Software zu optimieren.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 17, 2012 22:36 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
*kopfkratz* Was ist denn mit dem Thread passiert? hmm... *Buchempfehlungen rausfisch*

Erstmal danke wegen der vielen Tipps zwecks Büchern und API und so :)

Ich find die Reflection-Lösung von Phlegmatiker mit den Lambdas hübsch. Ist das schon LINQ? Sieht mir eigentlich nicht nach LINQ aus, sondern nach den normalen Lambda-Funktionen in C#.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 17, 2012 23:41 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
Bei C# sind Exceptions super schnell und da kann man um sich werfen ohne sich groß sorgen zu machen.

Da muss ich dir eindeutig wiedersprechen. :wink:

Try...Catch...Finaly ist zwar schnell, Exceptions aber ganz und gar nicht.

Folgender Code braucht auf meinen Computer gut 1,5 Sekunden.
Eine Exception zu werfen kostet schon gut 1,5 Millisekunden(!?!). :shock:
Code:
  1.  
  2. Exception E = new ApplictionException("");
  3. for (int i = 0; i < 1000;i++)
  4. {
  5.     try
  6.     {
  7.         throw E;
  8.     }
  9.     catch
  10.     {}
  11. }
  12.  


EDIT: Also ich vermute jetzt sogar das das in C++ deutlich schneller geht.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 18, 2012 01:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
OpenglerF hat geschrieben:
Zitat:
Bei C# sind Exceptions super schnell und da kann man um sich werfen ohne sich groß sorgen zu machen.

Da muss ich dir eindeutig wiedersprechen. :wink:

Try...Catch...Finaly ist zwar schnell, Exceptions aber ganz und gar nicht.

Folgender Code braucht auf meinen Computer gut 1,5 Sekunden.
Eine Exception zu werfen kostet schon gut 1,5 Millisekunden(!?!). :shock:
Code:
  1. &nbsp;
  2. Exception E = new ApplictionException("");
  3. for (int i = 0; i < 1000;i++)
  4. {
  5. &nbsp; &nbsp; try
  6. &nbsp; &nbsp; {
  7. &nbsp; &nbsp; &nbsp; &nbsp; throw E;
  8. &nbsp; &nbsp; }
  9. &nbsp; &nbsp; catch
  10. &nbsp; &nbsp; {}
  11. }
  12. &nbsp;


EDIT: Also ich vermute jetzt sogar das das in C++ deutlich schneller geht.


Autsch, ich hab gerade nochmal ein Test laufen lassen.
Code:
  1. DateTime start=DateTime.Now;
  2. Exception E = new Exception("");
  3. for (int i=0;i<1000;++i)
  4. {
  5.     try
  6.     {
  7.         throw E;
  8.     }
  9.     catch (Exception e)
  10.     {
  11.     }
  12. }
  13. DateTime stop=DateTime.Now;
  14. TimeSpan delta=new TimeSpan(stop.Ticks)-new TimeSpan(start.Ticks);
  15. Console.WriteLine(delta.TotalMilliseconds);

c# == 2503-2591ms

Code:
  1. RadonFramework::Time::DateTime start=RadonFramework::Time::DateTime::Now();
  2. std::exception Except;
  3. for (RadonFramework::Core::Types::UInt32 i=0;i<1000;++i)
  4. {
  5.     try
  6.     {
  7.         throw Except;
  8.     }
  9.     catch (std::exception& e)
  10.     {
  11.     }
  12. }
  13. RadonFramework::Time::DateTime stop=RadonFramework::Time::DateTime::Now();
  14. RadonFramework::Time::TimeSpan delta(stop.Ticks()-start.Ticks());
  15. CWrite(delta.ToString());

C++ == 215-250ms

War zwar kein High Performance Counter im Einsatzt aber bei den größenordnungen war das auch nicht mehr notwendig.
Ich hab mit VC#2010 und VC++2010 getestet, GCC kann ich auf die schnelle nicht testen.
Hier mal eine gute Doku zur c++ ABI.
Je tiefer die exception liegt, des so teurer wird die.
Unter Debian5 mit gcc hab ich die Erfahrung gemacht, dass ich teilweise bis zu 2 Sekunden gewartet hab, bis die Exception geworfen wurde.
Hier schreibt der Author allerdings auch, dass die C++ compiler immer mehr optimiert werden um exceptions schneller zu machen.

edit:Auch der Typ von Exception macht ein Unterschied, in der Performance. Da noch Daten vom System abgefragt werden(z.B. Callstack) können oder auch noch diverse String Operationen und so weiter durch laufen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 18, 2012 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Frase hat geschrieben:
Ich find die Reflection-Lösung von Phlegmatiker mit den Lambdas hübsch. Ist das schon LINQ? Sieht mir eigentlich nicht nach LINQ aus, sondern nach den normalen Lambda-Funktionen in C#.

Ja. Das ist schon Linq. Durch Linq werden die Klasse mit Methoden erweitert, die Lambda Funktionen übergeben bekommen. Unter anderem das Where und die Bedingung ist das Lambda.

Linq bringt aber auch noch eine Spracherweiterung mit. Damit kannst du inline in deinen Code eine stark an SQL angelehnte Syntax verwenden. Der Compiler übersetzt das dann in die entsprechenden Erweiterungsmethoden. Wenn ich es richtig verstanden habe, dann kann es je nach Linq Objekt auch sein, dass diese Erweiterungsmethode dann wieder direkt in eine SQL Query überführt werden. Denn bei Datenbanken macht es keinen Sinn, wenn die Methoden die Daten lokal filtern würden. In letzter Instanz hat man da dann SQL mit Compiler Syntaxprüfung.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 20, 2012 00:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
OpenglerF hat geschrieben:
Eine Exception zu werfen kostet schon gut 1,5 Millisekunden(!?!). :shock:

oh wie schrecklich :wink:
Mal im ernst selbst auf Dynamics krieg ich höchstens 30-70 Exception pro Kernminute und ich glaube nicht das jemand so blöde istn Spiel so instabil wie das Zeug zu schreiben.

[edit]
was übrigens bei weitem schneller ist als ein Fehler beim Laden einer Textur in Quake :P

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 20, 2012 02:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Also ich find das schon langsam, zwar hab ich gedacht, dass es noch um einiges langsamer ist(hab ja schon geschrieben, dass es in einem älterem Test teilweise in den Sekundenbereich ging) aber 2.5ms sind bei einem budget von 33ms(30FPS) schon 7,5%.
Nun gehen wir mal ein Schritt weiter und denken an Physik oder AI, denn bei 30Hz würde die furchtbar instabil laufen, also sagen wir mal 60Hz.
Wenn also nur eine einzige Exception geworfen wird, dann verbraucht die 15% der Zeit, nur weil vieleicht mal ein float 0 ist und zur division rangezogen wurde.
Nene, da wird wohl jeder sagen, dass eine Prüfung "if (f!=0) a=b/f;" weniger Zeit benötigt, fest eingeplant werden kann und den Code nicht gerade unleserlich macht.
Noch dazu darf man nicht vergessen, dass C++ kein finally hat und man den Code, der auf Exceptionbasierte Ausnahmenbehandlung aufbaut mehr Liebe bedarf, da sonnst memleaks auftreten.
In C# hab ich den Programmierstiel übernommen und benutzte keine Exceptions, ich fange lediglich an den wenigen Stellen, wo es nicht anders geht welche von .Net ab aber sonnst regel ich das über andere Wege.

Es geht ja auch nicht darum Exceptions zu verteufeln, sie sind praktisch und machen auch das Entwickeln einfacher aber wie so oft ist es auch kein Allzweckwerkzeug und für alles, was in Echtzeit läuft eine schlechte Option. Da sollte man schon sehr bedacht vorgehen, wenn man Fehlerbehandlung macht, denn ein einfaches int oder bool ist wesentlich schneller.

Dass diese in c++ langsamer als in c# sind war allerdings ein Irrtum meiner seits :\

Na mal abwarten, wir haben auf Arbeit Programmierer von Farbrausch und die sind ja für ihre smarten Ideen bekannt.
Da kommen bestimmt noch coole C# tweaks in den kommenden Monaten.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 20, 2012 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
TAK2004 hat geschrieben:
Also ich find das schon langsam, zwar hab ich gedacht, dass es noch um einiges langsamer ist(hab ja schon geschrieben, dass es in einem älterem Test teilweise in den Sekundenbereich ging) aber 2.5ms sind bei einem budget von 33ms(30FPS) schon 7,5%.
Nun gehen wir mal ein Schritt weiter und denken an Physik oder AI, denn bei 30Hz würde die furchtbar instabil laufen, also sagen wir mal 60Hz.
Wenn also nur eine einzige Exception geworfen wird, dann verbraucht die 15% der Zeit, nur weil vieleicht mal ein float 0 ist und zur division rangezogen wurde.
Nene, da wird wohl jeder sagen, dass eine Prüfung "if (f!=0) a=b/f;" weniger Zeit benötigt, fest eingeplant werden kann und den Code nicht gerade unleserlich macht.
Noch dazu darf man nicht vergessen, dass C++ kein finally hat und man den Code, der auf Exceptionbasierte Ausnahmenbehandlung aufbaut mehr Liebe bedarf, da sonnst memleaks auftreten.
In C# hab ich den Programmierstiel übernommen und benutzte keine Exceptions, ich fange lediglich an den wenigen Stellen, wo es nicht anders geht welche von .Net ab aber sonnst regel ich das über andere Wege.

Es geht ja auch nicht darum Exceptions zu verteufeln, sie sind praktisch und machen auch das Entwickeln einfacher aber wie so oft ist es auch kein Allzweckwerkzeug und für alles, was in Echtzeit läuft eine schlechte Option. Da sollte man schon sehr bedacht vorgehen, wenn man Fehlerbehandlung macht, denn ein einfaches int oder bool ist wesentlich schneller.

Dass diese in c++ langsamer als in c# sind war allerdings ein Irrtum meiner seits :\

Na mal abwarten, wir haben auf Arbeit Programmierer von Farbrausch und die sind ja für ihre smarten Ideen bekannt.
Da kommen bestimmt noch coole C# tweaks in den kommenden Monaten.

Alles Richtig aber was ich eigentlich sagen wollte (und was du ja auch bestaetigst):
wenn man z.B. bei der Physik fuer ein Game soviele Exceptions bekommen koennte, das es Performance relevant ist, dann ist der Code den man geschrieben hat schlicht und einfach Mist. Da im Falle von Physik eigentlich Fehler nur durch grundlegende Sachen wie falsche Mathematik usw. entstehen koennten. Das trifft so ziehmlich auf Alle Funktionen zu die in Echtzeit ablaufen muessen. Natuerlich kann dabei ein gewisser Rest entstehen aber das wird man wohl nicht mal Ansatzweise an das genannte Beispiel von mir rannkommen :wink: (Die die es kennen wissen sicherlich wie fies das werden kann, ich sag nur mal Email senden :P)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 47 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.027s | 15 Queries | GZIP : On ]