Swift Beta Performance: Ordenação de arrays — o que deu errado?
\n\nSe você já visitou o Stack Overflow na época das primeiras versões beta do Swift, certamente se lembra da pergunta lendária que reuniu milhares de visualizações e centenas de comentários. Ela soava mais ou menos assim: "Por que a ordenação de arrays no Swift Beta é 100 vezes mais lenta do que no Objective-C?"
\n\nNaquela época, em 2014, foi um verdadeiro choque para a comunidade iOS. Desenvolvedores, acostumados com a ordenação relâmpago no Objective-C, de repente viram seus aplicativos travarem do nada. Hoje, anos depois, podemos analisar esse problema com calma: entender exatamente o que causava a lentidão, como o Swift evoluiu e, principalmente, como ordenar arrays corretamente no Swift moderno para não repetir os erros do passado.
\n\nNeste artigo, não vamos apenas recontar um bug antigo. Vamos realizar nossos próprios testes, escrever código e descobrir quais algoritmos de ordenação em Swift são realmente rápidos e quais são uma armadilha para iniciantes. Vamos nessa!
\n\nBreve histórico: o que aconteceu no Swift Beta?
\n\nNa primeira versão beta do Swift, a ordenação de um array de 100.000 números inteiros podia levar até 20 segundos. No Objective-C, a mesma operação era executada em 0,2 segundos. Uma diferença de 100 vezes! A razão estava no fato de que o Swift inicial usava uma implementação ineficiente do algoritmo de ordenação (Introsort com má escolha do elemento pivô), além de ter problemas de otimização ao compilar sem flags de otimização (-O).
\n\nAlém disso, na versão beta, o mecanismo de verificação dinâmica de limites (bounds checking) era acionado com frequência para cada acesso ao array, adicionando uma enorme sobrecarga. A conclusão era simples: o Swift era imaturo, mas o potencial era enorme.
\n\nComo ordenar arrays em Swift hoje? Melhores práticas
\n\nO Swift moderno (versões 5.x e superiores) é uma linguagem madura. A ordenação de arrays tornou-se não apenas rápida, mas uma das mais rápidas entre as linguagens mainstream. Vamos analisar os principais métodos.
\n\n1. Método nativo sort() — o padrão ouro
\n\nA maneira mais simples e recomendada é usar o método sort() (ordenação in-place) ou sorted() (retorna um novo array ordenado).
import Foundation\n\nvar numbers = [5, 3, 8, 1, 9, 2]\nnumbers.sort() // ordenação in-place\nprint(numbers) // [1, 2, 3, 5, 8, 9]\n\nlet sortedNumbers = numbers.sorted() // retorna um novo array\nprint(sortedNumbers) // [1, 2, 3, 5, 8, 9]\n\nInternamente, o sort() usa TimSort — um algoritmo híbrido que opera em O(n log n) na média e O(n) em dados quase ordenados. É o mesmo algoritmo usado em Python e Java. Ele é excelentemente otimizado para processadores modernos.
2. Ordenação com closure: customização
\n\nSe você precisar ordenar um array em ordem decrescente ou por um critério complexo, use um closure:
\n\nlet words = ["maçã", "laranja", "banana", "kiwi"]\nlet sortedByLength = words.sorted { $0.count < $1.count }\nprint(sortedByLength) // ["kiwi", "maçã", "banana", "laranja"]\n\nlet descendingNumbers = numbers.sorted(by: >)\nprint(descendingNumbers) // [9, 8, 5, 3, 2, 1]\n\nImportante: o closure deve ser uma função pura (pure function) — sem efeitos colaterais. Caso contrário, você corre o risco de obter comportamento imprevisível e queda de desempenho.
\n\n3. Ordenação de estruturas personalizadas
\n\nAo trabalhar com seus próprios tipos de dados, o melhor é implementar o protocolo Comparable. Isso permitirá usar sort() sem closure.
struct Person: Comparable {\n let name: String\n let age: Int\n\n static func < (lhs: Person, rhs: Person) -> Bool {\n return lhs.age < rhs.age // ordenar por idade\n }\n}\n\nle