Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

341

07.12.2013, 00:06

Das ist C# :D
Trotzdem hast du Recht. uint wäre besser gewesen^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

342

07.12.2013, 10:34

Womit zählt man denn in C# Schleifen, wenn man idiomatisch sauber sein will? Reine Neugier, ich habe noch nicht allzu oft mit C# Kontakt gehabt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

idontknow

unregistriert

343

07.12.2013, 12:25

Hab irgendwie schlechte Erfahrungen mit unsigned ints als Counter einer for-Schleife gemacht.. :p

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

344

07.12.2013, 12:45

Aber bestimmt nur, weil du sowas gebaut hast ;)
for ( uint i = foo; i >= 0; i-- )
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

345

07.12.2013, 12:45

Ja das kann auch ins Auge gehen ;).

C-/C++-Quelltext

1
for( unsigned int i = list.size() - 1; i >= 0; --i)

idontknow

unregistriert

346

08.12.2013, 00:52

Aber bestimmt nur, weil du sowas gebaut hast ;)
for ( uint i = foo; i >= 0; i-- )

Ja das kann auch ins Auge gehen ;).

C-/C++-Quelltext

1
for( unsigned int i = list.size() - 1; i >= 0; --i)


Kanns ehrlich gesagt nicht genau sagen bzw. hab keinen konkreten Fall parat, aber letztlich läufts auf einen Overflow hinaus, ja ;)
Grundsätzlich ist auch die Frage inwiefern maximale Typ Korrektheit sinnvoll ist, z.b. die ganze WinAPI verwendet ja soweit ich weiß für z.b. Größenangaben von Fenstern o.ä. ints (und reserviert negative ints für speziall Werte?). Spätestens an solchen Stellen zu diversen APIs gibt's dann doch Reiberei die man irgnedwie beheben muss..

Ist halt ein bisschen dieser Konflikt.. für ein Fenster macht nur eine positive Dimension Sinn, aber wenn eine API die negativ Werte für irgendwas mitbenutzt biste direkt in einem Dilemma (unter Umständen). Das war jetzt mitunter ein schlechtes Beispiel.. aber denke das Problem kam rüber.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

347

08.12.2013, 17:26

Zitat

Womit zählt man denn in C# Schleifen, wenn man idiomatisch sauber sein will?

Mit "int", "uint". Ist immer 32 Bit. Oder über "IEnumerator"/"IEnumerable". Das funktioniert aber nur sehr eingeschränkt und unperformant ist noch dazu. Man kann nur vorwärts in 1er Schritten iterieren, also nicht wie die Iteratoren in C++.
Meiner Meinung nach hat C# hier ziemlich versagt. Und 32 Bit Indices werden bald nach hinten los gehen. Schon jetzt wäre es theoretisch auf den meisten Computern möglich, entsprechend große Listen zu benützen.

Was ich persönlich absolut WTF finde ist, dass praktisch kein C++ Programmierer std::size_t/std::ptrdiff_t oder die Typen fester Breite einsetzt.
Erst letztens bei ZLIB entdeckt:

Zitat von »http://www.zlib.net/zlib_faq.html#faq32«

Can zlib work with greater than 4 GB of data?
Yes. inflate() and deflate() will process any amount of data correctly. Each call of inflate() or deflate() is limited to input and output chunks of the maximum value that can be stored in the compiler's "unsigned int" type, but there is no limit to the number of chunks. Note however that the strm.total_in and strm_total_out counters may be limited to 4 GB. These counters are provided as a convenience and are not used internally by inflate() or deflate(). The application can easily set up its own counters updated after each call of inflate() or deflate() to count beyond 4 GB. compress() and uncompress() may be limited to 4 GB, since they operate in a single call. gzseek() and gztell() may be limited to 4 GB depending on how zlib is compiled. See the zlibCompileFlags() function in zlib.h.

The word "may" appears several times above since there is a 4 GB limit only if the compiler's long type is 32 bits. If the compiler's long type is 64 bits, then the limit is 16 exabytes.

Ja, immer schön weiter die eingebauten Typen benutzten. :fie:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (08.12.2013, 18:59)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

348

08.12.2013, 18:45

Oder über "IEnumerator"/"IEnumerable". Das funktioniert aber nur sehr eingeschränkt und unperformant ist noch dazu. Man kann nur vorwärts in 1er Schritten iterieren, also nicht wie die Iteratoren in C++.
Meiner Meinung nach hat C# hier ziemlich versagt.


Also IEnumerable ist natürlich mindestens genau so schnell wie eine for schleife...

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

349

08.12.2013, 19:21

Quelle? Ich habe da ganz andere Erfahrung gemacht.
In meinen Testcode habe ich bei "foreach" vs "for" einen 10 fachen Performanceunterschied gemessen.
Der Quelltext mit Testprogramm ist angehängt.
Ich vermute, es liegt einfach daran, dass IEnumerable ein Interface ist, deren Funktionen virtuell aufgerufen werden müssen. Wenn man nämlich nicht auf das "IEnumerable"-Objekt zugreift sondern direkt auf die Instanz, dann ist der Unterschied deutlich geringer.

Und ja, es ist wohl meistens nicht relevant, ich wollte es trotzdem gesagt haben.
»Spiele Programmierer« hat folgende Datei angehängt:

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

350

08.12.2013, 19:56

Hm... das widerspricht irgendwie allen Zahlen, die ich jemals produziert hab O.o

Quellcode

1
2
3
4
5
Iterations: 32768
TestArrSize: 16384
Time0: 1708,0961ms (for)
Time1: 4145,5759ms (foreach)
Time2: 2059,1095ms (foreach)


Time2 ist von mir wie ich IEnumerable verwenden würde: foreach( int Temp in TestArr )
Also ohne explizit ein neues IEnumerable anzulegen. Die 300ms unterschied kann ich trotzdem gerade nicht so ganz nachvollziehen

Werbeanzeige