А ты посмотри исходный код обоих методов и сразу всё станет понятно. Метод delete вызывает написанную на C функцию arraycopy, которая с параметрами передаваемыми в неё при аргументах 0 и sb.length не делает ничего и сразу возвращает управление. Метод setLength сначала делает вызов другого метода ensureCapacityInternal, который проверяет текущую длину массива, и только потом устанавливает новый размер. Во втором случае тупо больше вызовов и каждый из них медленнее, чем arraycopy с нулевым параметром length.