I tried the binary search approach but it was still much slower than my best version on my test data.
For reference, here's what I tried: proc commonPrefix*(paths: openArray[string], sep = "/"): string = if len(paths) < 1: return "" let first = paths[0] if len(first) < 2: return first var lo = 0 var hi = foldl(paths.mapIt(len(it)), min(a, b)) - 1 # min len while lo <= hi: let mid = lo + (hi - lo) div 2 var ok = true block loop: for s in paths[1 .. ^1]: for i in lo .. mid: if s[i] != first[i]: ok = false break loop if ok: result.add(first[lo .. mid]) lo = mid + 1 else: hi = mid - 1 Run