You can make fast detection and only if something is close enough, you make more precise detecting.
The simplest detection is ball one, you just detect if distance between ball and objects is smaller than size of ball+size of object (for object you take bigest size it have):
distance#=sqrt((x_ball#-x_object#)*(x_ball#-x_object#)+(y_ball#-y_object#)*(y_ball#-y_object#)+(z_ball#-z_object#)*(z_ball#-z_object#))
if distance#<ball_size#+object_size# then ---make more precize collision detection for these two ball and object--
similar if you move ball for 50 units each time and substep is 5:
distance#=sqrt((x_ball#-x_object#)*(x_ball#-x_object#)+(y_ball#-y_object#)*(y_ball#-y_object#)+(z_ball#-z_object#)*(z_ball#-z_object#))
if distance#<50
for a=1 to 10
-move ball 5-
-detect collision for ball-
next a
else
-move ball 50-
endif
this would move ball normaly 50 units and only if there is posibility that ball owerstep object then its making substep detection.
Like this you can speed your things up...