Riesenprobleme bei Iteration!

Hallo liebe Experten,

ich schreibe an einem Programm, das verschieden Variablen einen Wert zuweist und danach alle möglichen Kombinationen der Werte von den Variablen ausprobiert. In einer Gleichung werden alle Variablen mit ihrer jeweiligen Wertekombination verrechnet.

Ich schreibe dieses Programm, weil es ein praktisches Problem gibt, daß wir berechnen müssen. Mittlerweile habe ich auch ein lauffähiges Programm, nur habe ich festgestellt, daß die Berechnung unseres Problems etwa 6 Jahre dauern würde! :frowning:

Im Grunde handelt es sich um eine ganz normale Iteration. Man müßte sie nur beschleunigen können. Gibt es zu diesem Thema praktische Beispiele auf dem Internet? Oder habt Ihr vielleicht so etwas?

Für jeden Beitrag würde ich mich sehr freuen, ich weiss zur Zeit nämlich nicht mehr, wie ich weitermachen soll.

Viele Grüße

Bernhard Krämer

Nachtrag zur Iteration : die For Schleifen sind’s
Hallo nochmal,

ich habe rausgefunden, das nicht meine Rechnung das Programm so langsam macht. Es ist folgendes:

ich habe 7 For-Schleifen ineinander verschachtelt. Jede zählt bis 24.
Wenn ich nichts in diese Schleifen hineinschreibe, also gar keinen Befehl ausführe, dann braucht das Programm genauso lange, als wenn ich in diesen Schleifen noch etwas rechnen würde. Nämlich ~ 6 Jahre. Verdammt, was mache ich denn da? Ich weiss nämlich nicht, wie ich For-Schleifen vermeiden kann. Geht es mit einer anderen Programmiersprache schneller, oder gibt es da einen Trick? Etwas, was man wissen müsste?

Viele Grüße

Bernhard Krämer

Hallo Bernhard,

ich habe rausgefunden, das nicht meine Rechnung das Programm
so langsam macht. Es ist folgendes:

ich habe 7 For-Schleifen ineinander verschachtelt. Jede zählt
bis 24.

Wenn ich das nachrechne ergeben sich 0.041 s pro Durchgang.

Auf jeden Fall sind 24^7 Durchläufe eine ganze Menge. Bei einer Laufzeit von 1mS pro Durchgang ergeben sich dann immer noch 53 Tage rechenzeit. Aternativ solltest das Programm auf einem Super-Rechner laufen lassen.

Wenn ich nichts in diese Schleifen hineinschreibe, also gar
keinen Befehl ausführe, dann braucht das Programm genauso
lange, als wenn ich in diesen Schleifen noch etwas rechnen
würde. Nämlich ~ 6 Jahre. Verdammt, was mache ich denn da? Ich
weiss nämlich nicht, wie ich For-Schleifen vermeiden kann.
Geht es mit einer anderen Programmiersprache schneller, oder
gibt es da einen Trick? Etwas, was man wissen müsste?

Basic ist für deinen Fall sicher die falsche Programmiersprache!

Ich würde zumindest die ganze Schlaufen-Geschichte in C schreiben. Je nachdem wie die Restliche Aufbereitung der Daten sein muss kann man dann diesen Teil in eine DLL packen und von BASIC aus aufrufen oder dann gleich alles in C schreiben.

Mit C++ must du dann schon aufpassen was du genau machst, denn mit den Objekten passiert da einiges im Hintergrund, was dann wieder sehr bremsen kann.

hallo

ich hab folgendes program geschrieben:

Option Explicit
Const doit As Long = 24
Private Sub Command1\_Click()
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
Dim f As Long
Dim g As Long


Label1 = Now


For a = 1 To doit
 For b = 1 To doit
 For c = 1 To doit
 For d = 1 To doit
 For e = 1 To doit
 For f = 1 To doit
 For g = 1 To doit
 Next
 Next
 Next
 Next
 Next
 Next
Next

Label2 = Now

End Sub

Dauert auf einem P4 1.8GHz ca. 1.5 min
von 6 Jahren keine spur :wink: oder hab ich die frage falsch verstanden?

gruss
giuseppe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

off topic: .net schaffts in 25sec :smile: o.t.
.

Schade

Basic ist für deinen Fall sicher die falsche
Programmiersprache!

Schade, eigentlich. Denn ich bin noch sehr unbeholfen mit dem Programmieren. Und Basic sah so einfach aus… Allerdings habe ich jetzt schon gemerkt, daß C++ bei den einfachen Sachen, die ich darin programmieren kann, schon etwas schneller und stabiler ist als VB (habe unter C++ auch nur die Konsole benutzt - (was will man mehr))

Viele Grüße

Bernhard Krämer

Will auch!
Hallo,

was ist denn .net? Will ich auch haben!

P.S: Mit den ~6 Jahren, das waren auch 11 Schleifen, nicht nur 7, sorry. Übrigens: C++ schafft in einer konsolenanwendung das ganze in 230 Tagen
(Falls sich jemand wundert oder mich für total bescheuert hält, ich habe das so ausgerechnet: Ich habe mir nach dem x.ten Schleifendurchgang immer etwas auf dem Bildschirm ausgeben lassen. Wenn das so ungefähr eine Sekunde war und davor im Quelltext noch ein paar Schleifen kommen, kann ich mir ungefähr ausrechnen, wie lange das Programm noch braucht)

Grüße!

Bernhard

Wie wärs denn wenn Du mal Deinen Source (den wichtigen
Teil) postest, dann kann man wohl mehr den Optimierungs-
hebel ansetzen. Es gibt ja auch andere Möglichkeiten
wie z.B. auf völlig sinnlose Werte zu prüfen und somit
abzukürzen oder sowas. So geheim wird ja der Kram wohl
nicht sein, den Du schreibst. Wenn Du Angst hast hier
ausgelacht zu werden - keine Sorge… hier werden noch
so billige Fragen beantwortet (zumindest von mir)…

Alex

Hallo Alex,
das ist lieb von Dir. Aber ich habe schon den Eindruck, daß es gar nichts bringt, wenn ich die Source zur Diskussion stelle. Aus dem ganz einfachen Grund: Ich habe schon tolle rekursive Funktionen etc geschrieben, nur um dann festzustellen, daß das ganze so kompliziert wird, daß es sich nicht lohnt. Zumal ich nur sehr wenig Zeit dazu habe.
Also wollte ich bei unserem konkreten Fall bleiben und ein Programm schreiben, daß nur genau unseren Spezialfall berechnet. Das schafft das Programm glücklicherweise noch in ~2 bis 3 Minuten.
Falls das Programm aber einmal Erweiterungen erfahren soll, werde ich gerne die Source dazu posten.
Vielen Dank auf jeden Fall für die nette Hilfsbereitschaft!

Viele Grüße

Bernhard

P.S: Habe gerade angefangen, den Quelltext in C neu zu schreiben. Hoffentlich wird das was - die Source ist unkompliziert und klein, aber meine C-Kenntnisse sind arg beschränkt.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi

.NET ? --> http://www.microsoft.com/net/basics/ hier findest du infos dazu.
(gibt auch eine .net forum hier im www)

P.S: Mit den ~6 Jahren, das waren auch 11 Schleifen, nicht nur
7, sorry. Übrigens: C++ schafft in einer konsolenanwendung das
ganze in 230 Tagen

Ich kann mir trotzdem nicht vorstellen, dass das so lange geht. werde heute nochmals probieren :smile:

gruss

Hallo giuseppe,

ich hab folgendes program geschrieben:

Dauert auf einem P4 1.8GHz ca. 1.5 min

VB6:
AMD 1800+ Auch etwa 1.5min.
Compiliert, alle überprüfungen abgeschaltet: ca 15 Sek.

von 6 Jahren keine spur :wink: oder hab ich die frage falsch
verstanden?

MfG Peter(TOO)

so geht’s schneller
Hallo!

Ich habe das Programm von Giuseppe verändert und komme auf weniger als eine Sekunde.

Hier der Code:

Const doit As Integer = 24
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
a = 0

Label1 = Now
While a 
Vielleicht hilft's.


Gruß

Wolfgang

wenn du long statt ingeger verwendest gehts noch schneller :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ganz allgemein fallen mir 2 Sachen ein:

  • Doppelte Berechnungen vermeiden
  • die Schrittweiten variabel gestallen (erst grob, dann feiner)

Gruss
Nils

Hallo,

ich glaube das Problem liegt mit darin das du dir die
die Ergebnisse auf dem Bildschirm anzeigen läßt.
Ich habe die Erfahrung gemacht das wenn mann solche Iterationen im Hintergrund ablaufen läßt und erst am ende das ergebnis anzeigt dann sind Sie erheblich schneller.
Ich stimme aber zu das VC++ gegenüber VB6 schneller
ist.

Grundsätzlich sollte die klar sei das bei max.
24^11 = 1,52* 10^15 durchgängen das nicht in ein paar Sekunden erledigt ist.

MfG Christian