^0.5 schneller als SQR

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

grafe

Betreff: ^0.5 schneller als SQR

BeitragMo, Jun 27, 2011 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo zusammen,
heute bin auf etwas gestossen:
BlitzBasic: [AUSKLAPPEN]
Print "Mit Sqr()"
Milli=MilliSecs()

For x=0 To 100000000
var#=Sqr(26)
Next

Print MilliSecs()-Milli
Print Var
Print "Mit ^0.5"
Milli=MilliSecs()

For x=0 To 100000000
var#=26^0.5
Next

Print MilliSecs()-Milli
Print Var
WaitKey()


26^0.5 ist deutlich schneller (ohne debugger) als sqr(26), bei mir fast doppelt so schnell.
Ich frage mich nun woran das genau liegt Smile.

mfg Grafe

Xeres

Moderator

BeitragMo, Jun 27, 2011 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, das ist der selbe Grund, warum x*0.5 schneller ist als x/2 - Multiplikation & Division ist im Prinzip das selbe, aber die CPU braucht ein paar Zyklen mehr um die Division aus zu drücken. Selbes gilt dann für Potenzen/Wurzeln.
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)

Noobody

BeitragMo, Jun 27, 2011 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt daran, dass der Compiler 26^0.5 korrekt als konstanten Ausdruck ansieht und schon beim kompilieren vorausberechnet. Schlussendlich im Programm macht er dort nur noch var# = 5.09902.

Wenn du aber die 26 in eine Variable steckst, sieht der Vergleich ganz anders aus. Dann kann der Compiler den Ausdruck nämlich nicht mehr vorausberechnen, und siehe da, ^0.5 ist ganze 14 Mal langsamer als Sqr(): BlitzBasic: [AUSKLAPPEN]
Print "Mit Sqr()"
Milli=MilliSecs()

Local Temp = 26.0
For x=0 To 100000000
var#=Sqr(Temp)
Next

Print MilliSecs()-Milli
Print Var
Print "Mit ^0.5"
Milli=MilliSecs()

For x=0 To 100000000
var#=Temp^0.5
Next

Print MilliSecs()-Milli
Print Var
WaitKey()
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

grafe

BeitragMo, Jun 27, 2011 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Noobody, jetzt versteh ich Very Happy

mfg Grafe
 

BBPro2

BeitragDi, Jul 19, 2011 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@xeres

ist das so ? Oo
seltsamer compiler ist das, der das nicht wegoptimiert.... ^^

Xeres

Moderator

BeitragDi, Jul 19, 2011 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Machen wir einfach den Test:
BlitzBasic: [AUSKLAPPEN]
Print "*0.5"
Milli=MilliSecs()

Local i, v#, r#

SeedRnd(42)
For i=0 To 100000000
v#=Rnd(50,100)*0.5
Next

Print MilliSecs()-Milli
Print
Print "/2"
Milli=MilliSecs()

SeedRnd(42)
For i=0 To 100000000
v#=Rnd(50,100)/2.0
Next

Print MilliSecs()-Milli
WaitKey()


Ergibt bei mir ~1800 zu ~2000 - es ist nicht viel, aber für intensive Operationen ist Multiplikation die Rechenmethode der Wahl.
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)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jul 19, 2011 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann in etwa folgendes sagen:

Für eine Addition oder Subtraktion benötigt ein Prozessor 1 bis 3 Taktzyklen
Für eine Multiplikation benötigt ein Prozessor etwa 15 Taktzyklen
Für eine Division benötigt ein Prozessor etwa 80 Taktzyklen

Ausgehend eines 486er Prozessor. Ob modernere Prozessoren oder Unterschiede RISC zu CISC oder wie heute üblich pseudo-RISC im Grundbereich optimierter arbeiten kann ich nicht sagen.

In Hochsprachen wie Basic sind allerdings die unteren Taktzyklen nur schlecht messbar, da ein ganz anderer Overhead da drüber steht. Die Angaben beruhen auf eine Programmierung über Assembler.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group