myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays

 
Beiträge zu diesem Thema Autor Datum
 Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays sylvio 14.05.2019 16:58
 RE: Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays MarsStein 14.05.2019 17:29
 RE: Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays sylvio 14.05.2019 17:58
 RE: Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays sylvio 14.05.2019 18:38
 RE: Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays gfoidl 14.05.2019 18:44
 RE: Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays sylvio 15.05.2019 14:12

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
sylvio
myCSharp.de-Mitglied

avatar-2868.gif


Dabei seit: 19.11.2008
Beiträge: 60
Entwicklungsumgebung: VS 05+08, (+GNU-C/C++, PHP4/5)
Herkunft: Sachsen-Anhalt


sylvio ist offline MSN-Passport-Profil von sylvio anzeigen

Hohe und lange Laufzeiten bei großen mehrdimensionalen Arrays

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Zusammen,

Ist es "nornal" das große float-Arrays (~300k elemente) im typ: "float a[,,] " unter VS2017 (unter 64bit) bei c# beim ersten Zugriff so extrem höhere Zugriffzeiten haben? Ich kann da auch keinen großen Unterschied zwischen 32 und 64bit merken; ebenso macht ein Ausschalten des debugs quasi fast nichts aus.

Ich habe das so definiert/allokiert:
float[,,] yy = new float[MAX_y, MAX_s, MAX_phi];

Wenn ich dann ~300'000 zugriffe haben; also jedem feld wert zuweise; dauert dies (1 thread) in Summe rund 90sec. Ohne Array-Wert zuweisen aber nur ~1sec. Wenn ich das selbe testweise mal unter c++ mache; dauert das dem gegenüber aber nur knapp 2sec (also nicht mal Ansatzweise 90sec).
Das "komische" ist; wenn ich dann (unter c#) mit dem Array arbeite, dann sind die Zeiten auch wieder fast normal. fast so als wenn der bei jeder ersten Zuweisung in einem Array immer noch "intensive bondary-checks .." macht..


MfG
S.
14.05.2019 16:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 3.117
Entwicklungsumgebung: VS 2013, MonoDevelop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich hab das gerade mal ausprobiert mit einem float[70,70,70], also 343000 Werten, die ich mit Zufallswerten befüllt habe.
--> dauert auf meiner Maschine hier 7 Millisekunden...

Ich vermute also, dass bei Dir eher das Besorgen der Werte so lange dauert. Wo kommen die denn her?

Gruß, MarsStein

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am 14.05.2019 17:30.

14.05.2019 17:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
sylvio
myCSharp.de-Mitglied

avatar-2868.gif


Dabei seit: 19.11.2008
Beiträge: 60
Entwicklungsumgebung: VS 05+08, (+GNU-C/C++, PHP4/5)
Herkunft: Sachsen-Anhalt

Themenstarter Thema begonnen von sylvio

sylvio ist offline MSN-Passport-Profil von sylvio anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die kommen aus rund 1000 einzelnen Datenfiles, die jeweils float-Punkte enthaten.
Aber das (laden und parsen) kann es "eigentlich" nicht sein. Denn wenn ich die Zeile mit der ersten Array-Zuweisung raus nehme (nur diese), dann ist die Lade-Zeit (einschliesslich des parsens der files) sofort unter ~1sec.
Gut, muß ich mir mal ein Testprojekt damit erstellen und dort versuchen mi dem Array zu "experimentieren". Der Effekt ist jedenfalls sehr mysteriös :/


S.
14.05.2019 17:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
sylvio
myCSharp.de-Mitglied

avatar-2868.gif


Dabei seit: 19.11.2008
Beiträge: 60
Entwicklungsumgebung: VS 05+08, (+GNU-C/C++, PHP4/5)
Herkunft: Sachsen-Anhalt

Themenstarter Thema begonnen von sylvio

sylvio ist offline MSN-Passport-Profil von sylvio anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

-> DANKE!!!
Herje kann es fast nicht glauben; natürlich mein Fehler :)
Ich hatte ein j mit i "verdreht"; damit warf der zig Exception bei der Array-Zuweisung; die ich noch nicht vollständig abgefangen hatte. Hatte es daher nur nicht mitbekommen...


S.
14.05.2019 18:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.552
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo sylvio,

multi-dimensionale Arrays sind in .NET per Design sehr langsam, da für jeden Zugriff ein Methoden-Aufruf durchgeführt werden muss (zusätzlich zu Bound-Checks).

Wesentlich performanter sind sz-Arrays (single dimensional zero based), da bei diesen der JIT direkte Speicherzugriffe -- also ohne Hilfs-Methoden -- erzeugt.
Für mehrdimensionale Tensoren kommen somit "jagged Arrays" in Frage. D.h. float[][][]

Achte dann beim Zugriff auf die Elemente darauf -- v.a. per Schleife -- dass zusammenhängende Daten im Speicher angesprochen werden (memory locality und cache friendlyness).

Zitat:
damit warf der zig Exception bei der Array-Zuweisung; die ich noch nicht vollständig abgefangen hatte

Wie ist das zu verstehen? Bzw. anders rum: wenn du die Exception nicht handeln kannst, so lass es -- dann bekommst du den Fehler wenigsten frühzeitig mit => "fail early".


mfG Gü
14.05.2019 18:44 Beiträge des Benutzers | zu Buddylist hinzufügen
sylvio
myCSharp.de-Mitglied

avatar-2868.gif


Dabei seit: 19.11.2008
Beiträge: 60
Entwicklungsumgebung: VS 05+08, (+GNU-C/C++, PHP4/5)
Herkunft: Sachsen-Anhalt

Themenstarter Thema begonnen von sylvio

sylvio ist offline MSN-Passport-Profil von sylvio anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
multi-dimensionale Arrays sind in .NET per Design sehr langsam, da für jeden Zugriff ein Methoden-Aufruf durchgeführt werden muss (zusätzlich zu Bound-Checks).
Wesentlich performanter sind sz-Arrays (single dimensional zero based), da bei diesen der JIT direkte Speicherzugriffe -- also ohne Hilfs-Methoden -- erzeugt.
Für mehrdimensionale Tensoren kommen somit "jagged Arrays" in Frage. D.h. float[][][]

Achte dann beim Zugriff auf die Elemente darauf -- v.a. per Schleife -- dass zusammenhängende >Daten im Speicher angesprochen werden (memory locality und cache friendlyness).

Interessant - Danke . Ja muss ich mal mir mal in Ruhe anschauen (wenn die Anwendung erstmal soweit läut; ist halt wieder mal alles dringend^2). Ich komme eigentlich aus der c/c++/asm-welt; C# machte ich bisher immer nur "wenn zwingend verlangt" :/ Da ich solche "grossen" arrays bisher immer nur unter c/c++ machte, dachte ich schon das es durch evtl. c# und zig extra checks bedingt war :/

Zitat:
Wie ist das zu verstehen? Bzw. anders rum: wenn du die Exception nicht handeln kannst, so lass
es -- dann bekommst du den Fehler wenigsten frühzeitig mit => "fail early".

Ja, war an der Stelle halt noch alles "tricky" programmiert. Ein try/catch hatte hier "unbemerkt" "falsch" ausgelöst (schon vom code her richtig aber in der falschen schleife), nur weil ich da das "i" und "j" im Array verdreht hatte.
Ist halt wie meistens.. "der Bug sitzt idR vom Bildschrim" :-)


Danke nochmal an alle...



S.


mycsharp.de  Moderationshinweis von gfoidl (15.05.2019 16:01):

Bitte die BBCode [quote] verwenden, nicht jene von Markdown, etc.
Habs korrigiert.

 
15.05.2019 14:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.08.2019 14:29