| |
|
|
Andreas Koch | ¡Hola zusammen,
Yo debería después de Möglichkeit una Teil meines Programms en Einiges beschleunigen.
Dabei es se trata de un Procedimiento, el entweder una Reihe de Variables transferencia voluntad o direkt en el globalen Variables zugreifen muss. En el Variables es lo aktuell (todavía) en Arrays. Der gesamte Quellcode nimmt así a 40 Zeilen una. Laufen debería el Ganze en una 64-bit Sistema.
Welche Möglichkeiten hay como para mich? Im Verdacht Yo el Themengebiete: Ensamblador, XPIA, XPSE, Profano2CPP y "natives" Programmieren. Mit welchem Thema debería Yo mich como näher beschäftigen?
Mit freundlichen Grüßen
Andreas Koch |
|
|
| |
|
|
|
| Grüße!
Nimmste simplemente nProcs: [...] -
quasi natives Profano genau para Su Zweck entwickelt.
Gibt hier auch ya muy viele Características jeweils como Proc y nProc Nuevo -
simplemente nachfragen. Brauchst una konkretes Ejemplo? |
|
|
| |
|
|
|
Andreas Koch | Hola si,
danke para el entschiedene Antwort. Das spart Tiempo. Ein konkretes Ejemplo wäre no schlecht, al Besten con Übergabe de Arrays. Gibt lo una Anhaltspunkt, en wieviel el Ganze entonces más rápido se? |
|
|
| |
|
|
|
| Je después de Operation haben wir ya gemessen el una nProc 2.000 veces más rápido
como una Proc ser kann. In nProcs kannst auch Ensamblador uso. Schreib simplemente
veces una kleines Beispielprogramm con uno Proc y luego mache Yo Usted lo una
nProc. |
|
|
| |
|
|
|
Andreas Koch | 2000 veces más rápido es Musik en media Ohren. Ein vernünftiges Ejemplo kann Yo allerdings sólo morgen redactar, como Yo, el Programmcode no a Casa habe.
Wünsche wohl a ruhen. |
|
|
| |
|
|
|
Andreas Koch | Hola si, hier Yo ahora el Ejemplo.
Yo habe mi Procedimiento todavía una vez en zwei kleinere gesplittet, el algo übersichtlicher son. Das Plenario el Gaußsche Eliminationsverfahren para una Matrix beliebiger Größe y cualquier vielen Vektoren en el rechten Página abbilden. Vorraussetzung para el Lösbarkeit son el Singularität el Matrix y sämtliche Einträge en el Diagonalen<>0.
Como el beiden Prozeduren sólo zusammen Sinn ergeben, Yo ellos beide angehängt.
Wenn du nun el Procedimiento "Solver" en un nProc umwandeln könntest, wäre el una prima Sache. Yo sería mich entonces anschließend con el Procedimiento "Dreiecksmatrix" befassen. KompilierenMarcaSeparacióncls
var size!=6
Declare A![size!-1,size!-1], Zeile&, Spalte&, Diagonale&, Faktor!, aux!,Lastenarray![0,size!-1],Lastfall%,Verschiebungsarray![0,size!-1]
'Erzeugung zweier Zufallsmatrizen
WhileLoop 0,size!-1
Spalte&=&loop
WhileLoop 0,size!-1
Zeile&=&loop
A![Spalte&,Zeile&]=Rnd()
If Zeile&<1
Lastenarray![Zeile&,Spalte&]=Rnd()
EndIf
EndWhile
EndWhile
'Umformung, Erzeugung einer Dreiecksmatrix
proc Dreiecksmatrix
WhileLoop 0,size!-1,1
Diagonale&=&loop
WhileLoop Diagonale&+1,size!-1,1
Zeile&=&loop
Faktor!=A![Diagonale&,Zeile&]/A![Diagonale&,Diagonale&]
if Faktor!<>0
WhileLoop 0
Lastfall%=&loop
Lastenarray![Lastfall%,Zeile&]=Lastenarray![Lastfall%,Zeile&]-Faktor!*Lastenarray![Lastfall%,Diagonale&]
EndWhile
WhileLoop 0,size!-1,1
Spalte&=&loop
A![Spalte&,Zeile&]=A![Spalte&,Zeile&]-Faktor!*A![Spalte&,Diagonale&]
EndWhile
EndIf
EndWhile
EndWhile
EndProc
'Rücksubstitution
Proc Solver
Parameters Lastfall%
WhileLoop size!,1,-1
Diagonale&=&loop-1
aux!=0
WhileLoop Diagonale&+1,size!-1,1
Spalte&=&loop
aux!=aux!+A![Spalte&,Diagonale&]*Verschiebungsarray![Lastfall%,Spalte&]
EndWhile
Verschiebungsarray![Lastfall%,Diagonale&]=(Lastenarray![Lastfall%,Diagonale&]-aux!)/A![Diagonale&,Diagonale&]
EndWhile
EndProc
Dreiecksmatrix
Solver(0) >
WaitInput
PS: Wenn irgendjemandem una Fehler en el Code auffällt, insbesondere una Rechenfehler, Por favor, Yo por lo tanto, mich darüber a informieren.
PPS: Kann uno con uno nProc auch el Dibujar en uno Mapa de bits beschleunigen? |
|
|
| |
|
|
|
| Klar auch el Dibujar beschleunigen, kannst alles con hacer - son sí quasi unendlich viele Anwendungsgebiete. Ist sólo natives "Profan" con allen APIs.
Sinus: [...] Sand en Kugel: [...] Hier ne Incluir Pixels.inc: [...] Hier Ameisenpixel de eigenem Hilo: [...] Und bastante wichtig el hPic.inc: [...]
Oder otro Beispiele para nProc-Verwendung:
asyncMsgBox.inc - Rückmeldungen asynchroner MessageBoxen: [...] Canvas.inc: [...] CanvasListBoxen: [...] Keyboardhook después de Mensajes del usuario: [...] miclevel-inc-mikrophon-eingangslautstaerke: [...] OGL-2DUI: [...] RGB-Características: [...]
...
el son sólo unos pocos... son mtlw. así viel Schnulli... También incluye en el: [...]
Das hier es klasse: [...] y solltest Dir veces anschauen - con algo como kamma auch bastante rápidamente einfache Juegos herzaubern como z.B. el Hubi: [...]
Su Code kann Yo vermutlich sólo heute abend genauer ansehen - ahora muss Yo primero para Zahnarzt. |
|
|
| |
|
|
|
Andreas Koch | Como scheint lo sí alles Mögliche a geben. Das voluntad Yo veces en Ruhe anschauen necesario. Auf cada Fall danke para el Ayuda. |
|
|
| |
|
|
|
| So,
lass uns el Por favor, zusammen erarbeiten sodass entonces auch klar es, como funktioniert y por qué.
nProcs son Hilo- y APC ( [...] )- sicher y unheimlich rápidamente, porque el Code como Maschinencode ausgeführt se.
Damit nProcs Hilo- y APC-sicher ser puede, podrá, a globale Variables sólo lesend zugegriffen voluntad, sei porque, uno koordiniert el Schreibzugriffe z.B. por Semaphore ( [...] ) .
El sauberste y schnellste nProc kommt sin globale Variables de y verarbeitet el como Parámetro übergebenen Werte a una Rückgabewert. Lokale Variables (also en el nProc angelegte Variables) wiederum puede ser así viele deklarieren cómo möchte.
Ejemplo: KompilierenMarcaSeparación Auch mögliche Syntax: KompilierenMarcaSeparación Weitere mögliche Syntax: KompilierenMarcaSeparación Su Proc solver verwendet sin embargo globale Variables y überschreibt auch el Inhalte. Also wäre el erste Schritt, esta Procedimiento así umzuschreiben, dass ihr el verwendeten Arrays como Parámetro transferencia y ser auch el Rückgabewert dementsprechend una Array es sodass ellos para se alleine sólo el verarbeitet qué ihr como Parámetro transferencia wurde sin el ellos se qué de el Hauptprogramm saugen muss. Es auch unabhängig de nProc en Procs el vorzuziehende oder "saubere" Programmiertechnik.
¿Puede Usted el fix ajustar? |
|
|
| |
|
|
|
Andreas Koch | Ok, Problematik verstanden. Hier es el neue Code, wobei ahora todos Variables transferencia oder intern deklariert voluntad. KompilierenMarcaSeparacióncls
var size!=6
Declare A![size!-1,size!-1], Zeile&, Spalte&, Diagonale&, Faktor!, aux!,Lastenarray![0,size!-1],Lastfall%,Verschiebungsarray![0,size!-1]
Lastfall%=0
'Erzeugung zweier Zufallsmatrizen
WhileLoop 0,size!-1
Spalte&=&loop
WhileLoop 0,size!-1
Zeile&=&loop
A![Spalte&,Zeile&]=Rnd()
If Zeile&<1
Lastenarray![Zeile&,Spalte&]=Rnd()
EndIf
EndWhile
EndWhile
'Umformung, Erzeugung einer Dreiecksmatrix
proc Dreiecksmatrix
WhileLoop 0,size!-1,1
Diagonale&=&loop
WhileLoop Diagonale&+1,size!-1,1
Zeile&=&loop
Faktor!=A![Diagonale&,Zeile&]/A![Diagonale&,Diagonale&]
if Faktor!<>0
WhileLoop 0
Lastfall%=&loop
Lastenarray![Lastfall%,Zeile&]=Lastenarray![Lastfall%,Zeile&]-Faktor!*Lastenarray![Lastfall%,Diagonale&]
EndWhile
WhileLoop 0,size!-1,1
Spalte&=&loop
A![Spalte&,Zeile&]=A![Spalte&,Zeile&]-Faktor!*A![Spalte&,Diagonale&]
EndWhile
EndIf
EndWhile
EndWhile
EndProc
'Rücksubstitution
Proc Solver
Parameters Lastfall%, A![], Verschiebungsarray![], size!
Declare aux!, Zeile&, Spalte&, Diagonale&
WhileLoop size!,1,-1
Diagonale&=&loop-1
aux!=0
WhileLoop Diagonale&+1,size!-1,1
Spalte&=&loop
aux!=aux!+A![Spalte&,Diagonale&]*Verschiebungsarray![Lastfall%,Spalte&]
EndWhile
Verschiebungsarray![Lastfall%,Diagonale&]=(Lastenarray![Lastfall%,Diagonale&]-aux!)/A![Diagonale&,Diagonale&]
EndWhile
Return Verschiebungsarray![]
EndProc
Dreiecksmatrix
Verschiebungsarray![]=Solver(Lastfall%, A![],Verschiebungsarray![], size!)
WhileLoop 0,size!-1
Print Verschiebungsarray![0,&loop]
WaitInput
Was mache Yo porque, si yo zwei Arrays transferencia y otra vez zurückgeben muss (como en Procedimiento "Dreiecksmatrix")? Mir fällt dazu sólo una, dass Yo el una Array a el otro anfügen debería... |
|
|
| |
|
|
|
| Mehrere Werte (egal si Array etc) zurückgeben simplemente como el APIs lo auch tun indem simplemente una Handle/ Speicher zurückgegeben se/ Struktur. KompilierenMarcaSeparación |
|
|
|