Konstanten Vorteil?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

TimBo

Betreff: Konstanten Vorteil?

BeitragDi, Aug 04, 2009 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

die Frage lässt mich nicht los (ich hasse was wissen zu wollen aber keine Lösung mit google zu finden).
Also wir lernen alle brav, dass beim Programmieren Konstanten schneller sein sollen.

Nur warum sind diese schneller ?

Grüße
TimBo

PS:
Der Unterschied von Runtime und Compiletime konstanten ist: das Compiletime schon beim kompilen verarbeitet werden und Runtime(nicht in BB möglich) beim laufen des Programmes.
Warum sind diese Variablen schneller ??
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

n-Halbleiter

BeitragDi, Aug 04, 2009 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie sind nicht direkt schneller.

Der Vorteil von Konstanten ist ja, dass du zusammengehörige Informationen, z.B. das Offset in einer Bank, mit Konstanten zwischenspeichern kannst, und dann, wenn Informationen hinzugefügt werden, nicht überall das Hardgecodete Offset verändern musst, sondern nur an einer Stelle die Konstante. Sie machen also lediglich das Debuggen und Inhalte verändern schneller. Die Compiletime-Konstanten, so wie sie im BB zu benutzen sind, werden bei der Kompilierung sowieso durch die Werte, die sie enthalten, ersetzt, und sind somit genau gleich schnell (mal abgesehen davon, dass das Kompilieren evtl. geringfügig länger dauert).
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

TimBo

BeitragDi, Aug 04, 2009 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ahaa

also werden bei Constanten im Compiletime Stil einfach ersetzt

const offset=1
aus function(var+offset) macht der Compiler also
function(var+1)

d.h. sie nehmen keinen Speicher im Ram ein (einleuchtend)

Runtimeconstanten sind dann also nur eine Art constante bei der man dem Compiler verspricht sie nicht zu ändern (weil es vll. nicht nötig ist) aber im Grunde sind das ganz normale globale Variablen ?

Danke für die Antwort Very Happy
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Xeres

Moderator

BeitragDi, Aug 04, 2009 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Manchmal sind Konstanten auch einfach die bessere Wahl um ein Programm lesbarer zu halten. In längeren Quelltexten liest sich z.B. "KEY_UP" besser als "200".
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

TimBo

BeitragDi, Aug 04, 2009 1:06
Antworten mit Zitat
Benutzer-Profile anzeigen
da hast du recht !! Very Happy

Ich mache Scancodes sowieso IMMER am Beginn mit Constanten, ohne könnte ich mir es gar nicht mehr vorstellen.

Gruselige Codes wo drinsteht If keyhit(75) then

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

n-Halbleiter

Betreff: Runtime-Konstanten

BeitragDi, Aug 04, 2009 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Runtime-Konstanten sind wirkliche Konstanten. Das heißt, sie können nach der Deklaration nicht mehr verändert werden. Runtime-Konstanten zeichnen sich jedoch dadurch aus, dass sie bei der Deklaration einen variablen Wert annehmen können, was bei Compiletime-Konstanten nicht der Fall ist. In der Theorie sind sie beide für einen Compiler für z.B. C++ gleich zu Handhaben. Im C++ müssen ja sowieso alle Variablen im Vorfeld deklariert werden, ansonsten gibt es einen Error. Es gibt also zwei Durchläufe beim kompilieren: Beim ersten wird der Speicher für die Variablen reserviert und die Pointer gesetzt, bzw. schon setzbare Variablen - darunter Compiletime-Konstanten - auf ihren Wert gesetzt. Beim zweiten Durchgang wird dann der Code bearbeitet (in Assembler umgewandelt, interpretiert, ...) bzw. die reservierten Runtime-Konstanten auf ihren Wert gesetzt und dann versiegelt. BB kann scheinbar nur einen, dafür können Variablen eben "on-the-fly" deklariert werden, da nicht vorher Speicherplatz reserviert wird.

Kommt evtl. etwas spät, aber es kommt. Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Smily

BeitragDi, Aug 04, 2009 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Konstanten werden vor dem Compilieren mit ihrem wahren wert ersetzt.
Sprich, wenn du mit constanten arbeitest, ist es für den Compiler genauso, als würdest du mit den richtigen werten arbeiten.

aus
Code: [AUSKLAPPEN]

const SPEED = 3;
const KEY_LEFT = 203
const KEY_RIGHT = 205
const KEY_DOWN = 208
const KEY_UP = 200

[...]
if keydown(KEY_LEFT) x = x - SPEED
if keydown(KEY_RIGHT x = x + SPEED
if keydown(KEY_UP) y = y - SPEED
if keydown(KEY_DOWN) y = y + SPEED
[...]


wird dann
Code: [AUSKLAPPEN]

if keydown(203) x = x - 3
if keydown(205) x = x + 3
if keydown(200) y = y - 3
if keydown(208) y = y + 3


Ein weiterer Vorteil ist, dass du durch constanten einfach codeblöcke definieren kannst, die nicht mit compiliert werden.

aus:
Code: [AUSKLAPPEN]

const DEMO = 1
repeat
   if keyhit(57)
      print "tolle grundfunktion meines spiels"
      if not DEMO
         print "Tolle bezahlfunktion. Du hast die vollversion :)"
      else
         print "Du hast nur die Demo :("
      end if
   end if
until keyhit(1)


wird beim compilieren.

Code: [AUSKLAPPEN]

repeat
   if keyhit(57)
      print "tolle grundfunktion meines spiels"
      print "Du hast nur die Demo :("
   end if
until keyhit(1)


Wenn du den bytecode durchsuchst, wirst du sehen, dass die Texte aus dem vollversion-bereich nicht vorkommen.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

TimBo

BeitragDi, Aug 04, 2009 9:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ein weiterer Vorteil ist, dass du durch constanten einfach codeblöcke definieren kannst, die nicht mit compiliert werden.


Das wusste ich ja noch gar nicht, das ist ja echt genial !!
Werde ich mir merken

Gruß
TImBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

#Reaper

Newsposter

BeitragDi, Aug 04, 2009 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir stellt sich die Frage, warum (falls überhaupt)
Code: [AUSKLAPPEN]
If Var1 = 1 Then ...

schneller ist als
Code: [AUSKLAPPEN]
If Var1 = Var2 Then ...


Ist ersteres nun eigentlich wirklich schneller? Und wenn ja, wieso überhaupt. Also was macht der PC denn dann anders..?
(Mal im Hinblick auf BB und C++ oder Assembler)
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Geeecko

BeitragDi, Aug 04, 2009 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, Var2 ist nur eine Adresse.
Das heißt der PC muss jetzt die Zahl AN DER ADRESSE heraussuche.
Wenn du eine Konstante hast, weiß der PC die Zahl direkt, ohne sie erst heraus suchen zu müssen.
Aber das merkt man nicht... wegen der Geschwindigkeit...

lg MD
....

TimBo

BeitragDi, Aug 04, 2009 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

tata hier ist glaube ich eine Lösung des Probs in sicht

BlitzBasic: [AUSKLAPPEN]

Const j=0
Local k=0
Global l=0




For a=1 To 3
erstes=MilliSecs()
For i=1 To 100000
For ii=1 To 1000
If i=0 Then End
Next
Next
zweites=MilliSecs()
Print "ohne Variablen: "+(zweites-erstes)


erstes=MilliSecs()
For i=1 To 100000
For ii=1 To 1000
If i=j Then End
Next
Next
zweites=MilliSecs()
Print "mit Konstanter: "+(zweites-erstes)


erstes=MilliSecs()
For i=1 To 100000
For ii=1 To 1000
If i=k Then End
Next
Next
zweites=MilliSecs()
Print "mit Lokaler Var: "+(zweites-erstes)

erstes=MilliSecs()
For i=1 To 100000
For ii=1 To 1000
If i=l Then End
Next
Next
zweites=MilliSecs()
Print "mit Globaler Var: "+(zweites-erstes)

Print""
Next
WaitKey()


meine Zahlen:
297 (ohne var)
294 (constante)
260 (locale)
219 (globale)

299
293
259
221

297
297
256
216

bei mir sind die globalen Variablen am schnellsten, keine Var & Konstante das langsamste und das mittelfeld die Lokalen

das kann doch ned sein ?

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Nicdel

BeitragDi, Aug 04, 2009 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Ergebnis (mit BMax):

ohne Variablen: 163
mit Konstanter: 190
mit Lokaler Var: 170
mit Globaler Var: 180

ohne Variablen: 183
mit Konstanter: 167
mit Lokaler Var: 169
mit Globaler Var: 195

ohne Variablen: 163
mit Konstanter: 172
mit Lokaler Var: 194
mit Globaler Var: 166

2x ist ohne Variable am schnellsten, 1x die Konstante. Am langsamten ist 1x die Konstante, 1x die lokale und einmal die globale Variable. So ein Chaos.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

ChaosCoder

BeitragDi, Aug 04, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch BMax (Schleifen verhundertfacht):

Code: [AUSKLAPPEN]
ohne Variablen: 8100
mit Konstanter: 8213
mit Lokaler Var: 8103
mit Globaler Var: 9611

ohne Variablen: 8279
mit Konstanter: 8601
mit Lokaler Var: 8433
mit Globaler Var: 10897


Dadurch lässt sich folgendes (erstaunliches) feststellen:

In Bmax ist die Reihenfolge so: (schnell nach langsam)

ohne, lokale, konstante, globale

Irgendwas scheint BMax da nicht richtig zu machen, wenn denn eigentlich nach dem Kompilieren ohne und konstant gleich sein sollten...
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

TimBo

BeitragDi, Aug 04, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
genau das denke ich mir auch, ist auch in B3D so.
Sehr merkwürdig alles.

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Aug 04, 2009 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist überhaupt nichts merkwürdiges dran.

Eure Geschwindigkeitstest könnt ihr vergessen. Sowohl BB als auch B3D optimieren nach den ersten Sekunden die Speicherausnutzung und anderes Zeug. Das ist auch der Grund warum manche Programme kurz nach dem Start etwas hakeln oder rukeln. Wenn ihr nun mitten drin einen Speedtest durchführt, dann wird das Ergebnis verfälscht sein.

Nun mal kurz was Konstanten sind. Eine Konstante wird im Code vom Precompiler direkt durch die Zahl ersetzt. Dieser Wert steht nun auch so überall im Programm fest. Muß also nicht erst aus einem anderem Teil vom Speicher ausgelesen werden.

Eine Variable dagegen beinhaltet praktisch nur eine Speicherzieladresse wo dann der tatsächliche Wert gespeichert ist. Wenn nun da ''x'' steht, dann muß der Wert aus ''x'' ausgelesen werden bzw. direkt zur Rechenroutine zum Prozessor weiter geleitet werden. Das dauert i.d.R. etwas länger.

Im übrigen ist ein Speedtest mit so simplen Routinen nicht anwendbar, da sich hier eine ganz andere Größe mit einschleicht. Nämlich der Optimierungsdrang des Prozessors selbst. Das heisst, wenn ewig ein und die selben Aufgaben bearbeitet werden, speichern moderne Prozessoren (der letzten gefühlten 10 Jahre) den Maschinencode bei sich ab und rufen ihn nur noch ab, statt tatsächlich den ''echten'' Code zu bearbeiten. Mit ähnlichen Tricks arbeiten Java.Entwickler um ihre Programmiersprache nachweislich als die schnellste der Welt darzustellen. Eben mit solchen unnütz-Speedtests.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

TimBo

BeitragDi, Aug 04, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich wusste es...
immer wenn keiner weiß wos langgeht, kommt Hectic schreibt ein Beitrag und owned alle.
Respekt

Danke Very Happy

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

Cyderic

BeitragMi, Aug 05, 2009 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt übrigens noch ne nette Anwendungsmethode für Const. Wenn man so Menüabfragen hat wie
BlitzBasic: [AUSKLAPPEN]

Select menue
Case 1
;hautpmenue
Case 2
;optionsmenue
Case 3
;hau mir eine rein


Hat man ja oft die schwierigkeit das man anhand der Zahlen nicht immer weiss was das jetzt für ein Menü war (ausser es steht als kommi daneben). Da nimmt man dann eben

BlitzBasic: [AUSKLAPPEN]

Const Hauptmenue=1
Const Optionsmenue=2
Const HauMirEineRein=3

Select menue
Case Hauptmenue
.
.
.


Ganz nett wie ich finde Smile

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group