Instancie apenas o que o usuario ve na tela, e se livre de tudo que nao esta visivel. A ideia parece simples, mas gerenciar isso pode ser uma tarefinha bem macha.
Ah, e nao se esqueca que existem dois tipos de demora: a real e a percebida. Quanto maior a demora percebida, mais furiosos teus usuarios vao ficar, mas se a demora percebida continuar pequena, enquanto a real aumenta, ninguem fala nada
Muita gente não usa o código acima e as janelas são criadas todas quando o program roda. Como disse o cv:
o controle de instanciação é mais complexo do que o simples código acima, porém dá pra melhorar bastante.
Uma aplicação java nunca vai rodar tão rápido quanto uma aplicação Delphi idêntica (graficamente), por n motivos. Mas lembre-se que o que era lento há dois anos é aceitável hoje. Eu mesmo há uns três anos deixei de fazer um sistema em java por que achei que ficaria muito lento. Depois de um tempinho reclamando, hoje o cliente nem ia perceber a diferença e gozaria de todas as vantagens (eu também).
Pense bem, leve em consideração outros fatores também.
Duas palavras pra vc: splash screen. Que ironia da informática, colocar mais código pra melhorar a usabilidade durante um processo lento.
Em Swing, pelo menos (não sei como é com SWT), não vale à pena normalmente criar as janelas de novo, pq vc ataca sempe a velocidade aparente. Vale a pena criar JDialogs de novo, ainda mais se vc usa JOptionPane, pq tem várias otimizações aí.
Bom, tb tô falando de apps onde a GUI é o centro da atenção do usuário. É o caso de formulários. Em apps centradas em documento, como editores de texto, deve mudar bastante a abordagem.