08-30-2024, 01:21 AM
Play around with a pre-calculated set of coordinates:
Note that I just translated the easiest to modify routine (f4) to make use of just doing a lookup, rather than the math on the spot.
Performance here varies widely for me here, based on optimization flags, variable types (change that _DEFINE type a few times), and other such things...
Which leads me to the conclusion that you can only optimize down so much, and then you're defeating the purpose and over analyzing it. Speeds are going to always vary based on OS/memory/system/background processes/blah/blah/blah...
Just because one method works fastest on my machine, doesn't mean it's going to be the fastest on yours. If you TRULY have time-critical tasks, the best you can do is head to the PC/Laptop/Machine that needs to run that task, and then test and benchmark all those thousands of different variables and configurations that can come into play, and then you micro-optimize for that *one particular machine*.
It's like professional, Olympic level shooting and the care they take to perfectly bore and set up each rifle and sight, and then how they weigh out each grain of gunpowder that they manually load their ammo with, after the choose the perfect... blah blah and blah.... Compared to Joe Smoe who has a 20-year old rifle that was cleaned and oiled sometime in the last ten years, with ammo that's been on a shelf for the last five to forty years, and a scope that was kinda... maybe... sighted in probably about six years ago.
Sometimes you just have to say, "Meh, close enough," and then let it go as long as it'll still drop that deer at 100 yards and put food on your table.
Code: (Select All)
Screen _NewImage(1200, 700, 32)
_Define A-Z As LONG
Dim Shared CircleXPos(500, 500)
PreCalcX
Print
Print " fcirc fc fc3 fc4 precalc"
Print
For i = 1 To 10
'time the fcirc sub
t## = Timer(0.001)
For c = 1 To 15000
fcirc 400, 400, 100, _RGB(128, 128, 128)
Next
t1## = Timer(0.001) - t##
'time the fc sub
t## = Timer(0.001)
For c = 1 To 15000
fc 400, 400, 100, _RGB(255, 128, 128)
Next
t2## = Timer(0.001) - t##
'time the fc3 sub
t## = Timer(0.001)
For c = 1 To 15000
FC3 400, 400, 100, _RGB(128, 255, 128)
Next
t3## = Timer(0.001) - t##
'time the fc4 sub
t## = Timer(0.001)
For c = 1 To 15000
fc4 400, 400, 100, _RGB(128, 128, 255)
Next
t4## = Timer(0.001) - t##
'time the Steve sub
t## = Timer(0.001)
For c = 1 To 15000
StevePreCalcCircle 400, 400, 100, _RGB(255, 0, 0)
Next
t5## = Timer(0.001) - t##
Print t1##, t2##, t3##, t4##, t5##
Next
Sub fc (cx, cy, r, clr&)
For y = -r To r
x = Int(Sqr(r * r - y * y))
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Next
End Sub
Sub fc4 (cx, cy, r, clr&)
r2 = r * r
For y = 0 To r
y2 = y * y
'If y2 <= r2 Then
x = Int(Sqr(r2 - y2))
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
'End If
Next
End Sub
Sub FC3 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
r2 = r * r ' Dav mod
While y <= r
y2 = y * y
If y2 < r2 Then
x = Int(Sqr(r2 - y2))
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
End If
y = y + 1
Wend
End Sub
Sub fcirc (CX As Integer, CY As Integer, R As Integer, C As _Unsigned Long)
Dim Radius As Integer, RadiusError As Integer
Dim X As Integer, Y As Integer
Radius = Abs(R): RadiusError = -Radius: X = Radius: Y = 0
If Radius = 0 Then PSet (CX, CY), C: Exit Sub
Line (CX - X, CY)-(CX + X, CY), C, BF
While X > Y
RadiusError = RadiusError + Y * 2 + 1
If RadiusError >= 0 Then
If X <> Y + 1 Then
Line (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
Line (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
End If
X = X - 1
RadiusError = RadiusError - X * 2
End If
Y = Y + 1
Line (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
Line (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
Wend
End Sub
Sub StevePreCalcCircle (cx, cy, r, clr&)
$Checking:Off
For y = 0 To r
x = CircleXPos(r, y)
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Next
$Checking:On
End Sub
Sub PreCalcX
For r = 0 To 500 'circles with a radius from 0 to 500
r2 = r * r
For y = 0 To r
y2 = y * y
x = Int(Sqr(r2 - y2))
CircleXPos(r, y) = x
Next
Next
End Sub
Note that I just translated the easiest to modify routine (f4) to make use of just doing a lookup, rather than the math on the spot.
Performance here varies widely for me here, based on optimization flags, variable types (change that _DEFINE type a few times), and other such things...
Which leads me to the conclusion that you can only optimize down so much, and then you're defeating the purpose and over analyzing it. Speeds are going to always vary based on OS/memory/system/background processes/blah/blah/blah...
Just because one method works fastest on my machine, doesn't mean it's going to be the fastest on yours. If you TRULY have time-critical tasks, the best you can do is head to the PC/Laptop/Machine that needs to run that task, and then test and benchmark all those thousands of different variables and configurations that can come into play, and then you micro-optimize for that *one particular machine*.
It's like professional, Olympic level shooting and the care they take to perfectly bore and set up each rifle and sight, and then how they weigh out each grain of gunpowder that they manually load their ammo with, after the choose the perfect... blah blah and blah.... Compared to Joe Smoe who has a 20-year old rifle that was cleaned and oiled sometime in the last ten years, with ammo that's been on a shelf for the last five to forty years, and a scope that was kinda... maybe... sighted in probably about six years ago.
Sometimes you just have to say, "Meh, close enough," and then let it go as long as it'll still drop that deer at 100 yards and put food on your table.