Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
08-28-2024, 12:27 PM
(This post was last modified: 08-28-2024, 12:29 PM by bplus.)
OK now I checked with $Checking :OFF
and found I had the < wrong when fcirc had finally beat FC2 once!
So I got 7 FC2, 1 fcir and 2 ties.
Code: (Select All) _Title "FC2 edges out fcirc" ' b+ 2024-08-28
'Dav, AUG/2024 bplus mod 2024-08-28 try faster FC2 mod of fc
'fc & fcirc circle fill test.
'testing two filled circle SUB's for the fastest one.
'draws 100,000 circles and compares speed.
'fcirc still reigns as fastest on my laptop, by a little.
$Checking:Off
Screen _NewImage(1000, 700, 32)
_ScreenMove 150, 0
Randomize Timer
Print "Overlapping lines check of FC2"
FC2 500, 350, 300, &H200000FF ' check for overlapping lines
Print "Looking good! no lighter lines." ' FC passes too BTW
Print: Print " zzz... press any for timed test"
Sleep
'time the fc sub
t# = Timer
For c = 1 To 200000
fcirc Rnd * _Width, Rnd * _Height, 35, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
Next
t1# = Timer - t#
'time the fc2 sub
t# = Timer
For c = 1 To 200000
FC2 Rnd * _Width, Rnd * _Height, 35, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
Next
t2# = Timer - t#
Print
Print "fcirc ="; t1#
Print " FC2 ="; t2#
Print
If t2# < t1# Then
Print "FC2 wins!"
ElseIf t1# < t2# Then ' EDIT fixed!
Print "fcirc wins!"
Else
Print "Tie fcirc = FC2 time"
End If
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 FC2 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
While y <= r
x = Int(Sqr(r * r - y * y))
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
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
BTW I am running v3.13 and I am wondering if earlier versions would give these results.
b = b + ...
Posts: 723
Threads: 118
Joined: Apr 2022
Reputation:
106
08-28-2024, 12:30 PM
(This post was last modified: 08-28-2024, 12:38 PM by Dav.)
Hey, neat mod! I thought it may be a little faster putting the r * r outside of the loop, and it made it FC2 a wee bit faster
EDIT: (most of the time, FC3 ties FC2 now and then).
- Dav
Code: (Select All)
Sub FC3 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
r2 = r * r
While y <= r
x = Int(Sqr(r2 - y * y))
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
y = y + 1
Wend
End Sub
Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
08-28-2024, 12:37 PM
(This post was last modified: 08-28-2024, 12:42 PM by bplus.)
(08-28-2024, 12:30 PM)Dav Wrote: Hey, neat mod! I thought it may be a little faster putting the r * r outside of the loop, and it made FC2 a wee bit faster.
- Dav
Code: (Select All) Sub FC3 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
r2 = r * r
While y <= r
x = Int(Sqr(r2 - y * y))
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
y = y + 1
Wend
End Sub
+1 Yeah! one less calculation!
I just tested 10 runs on QB64 v 2.1 and the results are upside down!
7 wins for fcirc, 2 wins for FC2 and 1 tie!
Plus the times are less!!! (This is with checking off still).
Did you guys (developers) break something?
b = b + ...
Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
Update: I thought might be advantage to smaller circles but no!
And QB64 v2.1 does run this code significantly faster!
Bigger circles all on screen
Code: (Select All) _Title "FC3 versus fcirc QB64pe v3.13.1" ' b+ 2024-08-29
'Dav, AUG/2024 bplus mod 2024-08-28 try faster FC2 mod of fc
' 2024-08-29 try larger circles all on screen with FC3
$Checking:Off
Screen _NewImage(1000, 700, 32)
_ScreenMove 150, 0
Randomize Timer
Print "Overlapping lines check of FC2"
FC3 500, 350, 300, &H200000FF ' check for overlapping lines
Print "Looking good! no lighter lines." ' FC passes too BTW
Print: Print " zzz... press any for timed test"
Sleep
Cls
For i = 1 To 10 ' in case going first has disadvantage
'time the fc sub
t# = Timer
For c = 1 To 2000
fcirc Rnd * (_Width - 700) + 350, 350, 350, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
'_Display
Next
t1# = t1# + Timer - t#
'time the fc2 sub
t# = Timer
For c = 1 To 2000
FC3 Rnd * (_Width - 700) + 350, 350, 350, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
' _Display
Next
t2# = t2# + Timer - t#
Next
Print
Print "fcirc ="; t1#
Print " FC3 ="; t2#
Print
If t2# < t1# Then
Print "FC3 wins!"
ElseIf t1# < t2# Then ' EDIT fixed!
Print "fcirc wins!"
Else
Print "Tie fcirc = FC3 time"
End If
'_Display
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 FC3 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
r2 = r * r ' Dav mod
While y <= r
x = Int(Sqr(r2 - y * y)) ' r2 Dav
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
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
b = b + ...
Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
08-29-2024, 01:01 PM
(This post was last modified: 08-29-2024, 01:02 PM by bplus.)
Holy hell what is going on with QB64pe v 3.4.1 ???
Any body else still have version QB64pe v 3.4.1 ?
b = b + ...
Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
08-29-2024, 01:18 PM
(This post was last modified: 08-29-2024, 01:18 PM by bplus.)
Ah compiler options! The top X makes a difference
b = b + ...
Posts: 3,925
Threads: 175
Joined: Apr 2022
Reputation:
213
08-29-2024, 01:51 PM
(This post was last modified: 08-29-2024, 01:53 PM by bplus.)
OK I started using _Display because I didn't like seeing all those incomplete circles drawn and at first it looked like fcirc was going to win everytime. _Display definitely slowed everything down considerable. I had switched to declared Types for the FC3 sub because I thought the optimized compiler would love that!
I thought wrong! FC3 sub beat out fcirc 8 trials out of 10 when I switched back to default Single Type for the FC3 sub!!!
Not what I expected, but something I saw yesterday when playing around with mods of Dav's starting code.
8 out of 10 trials FC3 was faster with optimized compiler and using _Display to show completely drawn circles:
Code: (Select All) _Title "FC3 versus fcirc QB64pe v3.13.1" ' b+ 2024-08-29
'Dav, AUG/2024 bplus mod 2024-08-28 try faster FC2 mod of fc
' 2024-08-29 try larger circles all on screen with FC3
$Checking:Off
Screen _NewImage(1000, 700, 32)
_ScreenMove 150, 0
Randomize Timer
Print "Overlapping lines check of FC2"
FC3 500, 350, 300, &H200000FF ' check for overlapping lines
Print "Looking good! no lighter lines." ' FC passes too BTW
Print: Print " zzz... press any for timed test"
Sleep
Cls
For i = 1 To 10 ' in case going first has disadvantage
'time the fc sub
t# = Timer
For c = 1 To 2000
fcirc Rnd * (_Width - 700) + 350, 350, 350, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
_Display
Next
t1# = t1# + Timer - t#
'time the fc2 sub
t# = Timer
For c = 1 To 2000
FC3 Rnd * (_Width - 700) + 350, 350, 350, _RGB32(Rnd * 255, Rnd * 255, Rnd * 255)
_Display
Next
t2# = t2# + Timer - t#
Next
Print
Print "fcirc ="; t1#
Print " FC3 ="; t2#
Print
If t2# < t1# Then
Print "FC3 wins!"
ElseIf t1# < t2# Then ' EDIT fixed!
Print "fcirc wins!"
Else
Print "Tie fcirc = FC3 time"
End If
_Display
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 FC3 (cx, cy, r, clr&)
Line (cx - r, cy)-(cx + r, cy), clr&, BF
y = 1
r2 = r * r ' Dav mod
While y <= r
x = Int(Sqr(r2 - y * y)) ' r2 Dav
Line (cx - x, cy + y)-(cx + x, cy + y), clr&, BF
Line (cx - x, cy - y)-(cx + x, cy - y), clr&, BF
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
I am curious if your results differ? on both Windows and Linux systems
b = b + ...
Posts: 2,142
Threads: 221
Joined: Apr 2022
Reputation:
102
I thought Steve put it in a 'butshell' for us? Steve, what kind of a typo was that... miss hit the "N" key or the second 'T' didn't print? If the latter, why can't I find a buttcracker at Amazon? So far all Google gives me is the links to local plumbers.
Now not in regard to circle fill, but in regard to speed, I swear version 3.14 seems to take longer to compile source code. If so, for now the trade off for all the added bells and whistles is worth it. I sure hope, if I'm right, this won't be an issue in subsequent releases because I feel the need for speed!
Pete
Shoot first and shoot people who ask questions, later.
Posts: 723
Threads: 118
Joined: Apr 2022
Reputation:
106
Hey @bplus. I'm getting about 50/50 results with v3.13.0 under Linux.
- Dav
Posts: 2,142
Threads: 221
Joined: Apr 2022
Reputation:
102
Seriously guys, with results this close I will assert you can't tell which is faster by running the programs due to the various background processes always running in any operating system. So if consistent results are impossible, how can such small and inconsistent measurements be noteworthy?
Pete
Shoot first and shoot people who ask questions, later.
|