I get comparable times on this with all my variable types. I certainly don't see a difference of three times the performance with SINGLE over LONG.
Here's a quick test code though that will show a nice way to improve this and make it much quicker for you -- especially with integers. Hint: Swap out INT(x/y) for integer division with x \ y...
Integer Division (the \ division) is much faster than taking the integer value of normal division, as shown above.
x \ y is faster than INT(x / y). At least, it always has been for me on Windows with the math processors on my PCs and Laptops. Perhaps Linux or Mac handles them differently somehow?
Code: (Select All)
T0 = Timer
For chiffreetudie = 2 To 14000
premier = 1
For diviseur = 2 To chiffreetudie - 1
' Print "chiffre etudie = "; chiffreetudie; "Diviseur = "; diviseur; chiffreetudie / diviseur
If chiffreetudie / diviseur = Int(chiffreetudie / diviseur) Then
premier = 0
End If
Next diviseur
'If premier = 1 Then
' Print chiffreetudie;
'End If
Next chiffreetudie
Color 12: Print: Print "Duration (SINGLE) : "; Timer - T0; " seconds."
T0 = Timer
For chiffreetudie = 2 To 14000
premier = 1
For diviseur = 2 To chiffreetudie - 1
' Print "chiffre etudie = "; chiffreetudie; "Diviseur = "; diviseur; chiffreetudie / diviseur
If chiffreetudie / diviseur = chiffreetudie \ diviseur Then
premier = 0
End If
Next diviseur
'If premier = 1 Then
' Print chiffreetudie;
'End If
Next chiffreetudie
Color 12: Print: Print "Duration (SINGLE, INT DIVISION) : "; Timer - T0; " seconds."
Dim premier As Long ' SINGLE faster than INTEGER !!! Why ?
Dim chiffreetudie As Long ' SINGLE faster than INTEGER !!! Why ?
Dim diviseur As Long ' SINGLE faster than INTEGER !!! Why ?
T0 = Timer
For chiffreetudie = 2 To 14000
premier = 1
For diviseur = 2 To chiffreetudie - 1
' Print "chiffre etudie = "; chiffreetudie; "Diviseur = "; diviseur; chiffreetudie / diviseur
If chiffreetudie / diviseur = Int(chiffreetudie / diviseur) Then
premier = 0
End If
Next diviseur
'If premier = 1 Then
' Print chiffreetudie;
'End If
Next chiffreetudie
Color 12: Print: Print "Duration (LONG) : "; Timer - T0; " seconds."
T0 = Timer
For chiffreetudie = 2 To 14000
premier = 1
For diviseur = 2 To chiffreetudie - 1
' Print "chiffre etudie = "; chiffreetudie; "Diviseur = "; diviseur; chiffreetudie / diviseur
If chiffreetudie / diviseur = chiffreetudie \ diviseur Then
premier = 0
End If
Next diviseur
'If premier = 1 Then
' Print chiffreetudie;
'End If
Next chiffreetudie
Color 12: Print: Print "Duration (LONG, INT DIVISION) : "; Timer - T0; " seconds."
Here's a quick test code though that will show a nice way to improve this and make it much quicker for you -- especially with integers. Hint: Swap out INT(x/y) for integer division with x \ y...
(06-27-2025, 10:56 AM)Jack Wrote: integer division is notoriously slow, if I am not mistaken, integer division promotes a 32-bit dividend to 64-bit before division and likewise a 64-bit dividend is promoted to 128-bit before division
[edit]
integer division could possibly be sped up significantly by using invariant integers, see https://gmplib.org/~tege/division-paper.pdf
Integer Division (the \ division) is much faster than taking the integer value of normal division, as shown above.
x \ y is faster than INT(x / y). At least, it always has been for me on Windows with the math processors on my PCs and Laptops. Perhaps Linux or Mac handles them differently somehow?


