Porque existe uma enorme diferença entre otimizar o desempenho e desativar completamente uma segurança
Ao reduzir o número de GC, sua estrutura é mais responsiva e pode ser executada (presumivelmente) mais rapidamente. Agora, otimizar o coletor de lixo não significa que eles nunca façam uma coleta de lixo. Significa apenas que eles fazem isso com menos frequência e, quando o fazem, é executado muito rápido. Esse tipo de otimização inclui:
- Minimizar o número de objetos que se deslocam para um espaço sobrevivente (isto é, que sobreviveram a pelo menos uma coleta de lixo) usando pequenos objetos descartáveis. Objetos que foram movidos para o espaço do sobrevivente são mais difíceis de coletar e uma coleta de lixo aqui implica em congelar toda a JVM.
- Não aloque muitos objetos para começar. Isso pode sair pela culatra se você não tomar cuidado, pois os objetos da geração jovem são super baratos para alocar e coletar.
- Certifique-se de que o novo objeto aponte para o antigo (e não o contrário), para que o objeto jovem seja fácil de coletar, pois não há nenhuma referência a eles que fará com que eles sejam mantidos
Quando você diminui o desempenho, geralmente ajusta algum "hot spot" muito específico, ignorando o código que não é executado com frequência. Se você fizer isso em Java, poderá deixar o coletor de lixo ainda cuidar dos cantos escuros (já que não fará muita diferença) enquanto otimiza com muito cuidado a área que executa em um loop apertado. Assim, você pode escolher onde otimizar e onde não, e assim concentrar seu esforço no que interessa.
Agora, se você desativar completamente a coleta de lixo, não poderá escolher. Você deve descartar manualmente todos os objetos, sempre. Esse método é chamado no máximo uma vez por dia? Em Java, você pode deixar, pois seu impacto no desempenho é insignificante (pode ser bom permitir que um GC completo ocorra todos os meses). No C ++, você ainda está vazando recursos, portanto, você deve cuidar mesmo desse método obscuro. Portanto, você deve pagar o preço pelo gerenciamento de recursos em cada parte única do seu aplicativo, enquanto em Java você pode se concentrar.
Mas piora.
E se você tiver um bug, digamos no canto escuro do seu aplicativo, que só é acessado na segunda-feira na lua cheia? Java tem uma forte garantia de segurança. Há pouco ou nenhum "comportamento indefinido". Se você usar algo errado, uma exceção será lançada, o programa será interrompido e nenhuma corrupção de dados ocorrerá. Então você tem certeza de que nada de errado pode acontecer sem você perceber.
Mas em algo como D, você pode ter um acesso incorreto ao ponteiro ou um estouro de buffer e pode corromper sua memória, mas seu programa não saberá (você desligou a segurança, lembra-se?) E continuará funcionando com as informações incorretas. dados, faça algumas coisas bastante desagradáveis e corrompa seus dados, e você não sabe, e à medida que mais corrupção acontece, seus dados ficam cada vez mais errados e, de repente, eles se quebram, e estavam em um aplicativo essencial à vida, e ocorreu algum erro no cálculo de um foguete, e por isso não funciona, o foguete explode e alguém morre, e sua empresa está na primeira página de todos os jornais e seu chefe aponta o dedo para você dizendo "Você está o engenheiro que sugeriu que usamos o D para otimizar o desempenho, por que você não pensou em segurança?". E a culpa é sua. Você matou essas pessoas com sua tentativa tola de desempenho.
OK, ok, na maioria das vezes é muito menos dramático do que isso. Mas mesmo um aplicativo essencial para os negócios ou apenas um aplicativo de GPS ou, digamos, um site de assistência médica do governo pode gerar algumas conseqüências bastante negativas se você tiver bugs. Usar uma linguagem que os impeça completamente ou que falhem rapidamente quando eles acontecem geralmente é uma idéia muito boa.
Há um custo para desativar uma segurança. Ser nativo nem sempre faz sentido. Às vezes, é muito mais simples e seguro otimizar um idioma um pouco seguro, para buscar um idioma em que você possa se dar muito bem. Em muitos casos, a correção e a segurança superam os poucos nanossegundos que você teria eliminado ao eliminar completamente o GC. Disruptor pode ser usado nessas situações, então acho que o LMAX-Exchange fez a ligação certa.
Mas e D em particular? Você tem um GC, se quiser, para os cantos escuros, e o subconjunto SafeD (que eu não conhecia antes da edição) remove o comportamento indefinido (se você se lembrar de usá-lo!).
Bem, nesse caso, é uma simples questão de maturidade. O ecossistema Java está cheio de ferramentas bem escritas e bibliotecas maduras (melhor para o desenvolvimento). Muito mais desenvolvedores conhecem Java do que D (melhor para manutenção). Buscar uma linguagem nova e não tão popular para algo tão crítico quanto um aplicativo financeiro não seria uma boa idéia. Com uma linguagem menos conhecida, se você tiver um problema, poucos podem ajudá-lo e as bibliotecas que você encontra tendem a apresentar mais erros, pois foram expostas a menos pessoas.
Portanto, meu último argumento ainda é válido: se você deseja evitar problemas com conseqüências terríveis, fique com opções seguras. Neste ponto da vida de D, seus clientes são as pequenas empresas prontas para assumir riscos loucos. Se um problema pode custar milhões, é melhor ficar mais longe na curva dos sinos da inovação .