At best it will find a match immediately 1/2000, at worst at go 2000/2000, on average at go 1000/2000. You can but test it and see... If you are adding all cube-instances in the same SketchUp session then why not make a @points array to push [ <<] all of the points you will use during the placements - these need to be as arrays so they are 'comparable' [use point.to_a] - points are comparable as == but include? is faster [most probably] with array comparisons ? Then... instead of finding all instances and comparing each 'instance.origin' to 'point' use: @points.include?(point.to_a) If the tested point is in the current list then it's taken and you skip the operation... Of course this doesn't work when instances have been erased or across SketchUp sessions