Quem trabalha com algoritmos de otimização (exatos ou heurísticos) poderia responder esta pergunta?
:?: Hoje já é possível utilizar Java para a resolução de problemas de otimização no mundo real? Ou Java ainda perde feio para linguagens como C/C++. Lembrando que um ponto crítico para esses algoritmos é o tempo de processamento.
Estava eu em um projeto onde foi desenvolvido um Algoritmo Genético Fuzzy Híbrido. Infelizmente, ele demorava muito pra executar… Mas não acho que foi problema com o Java, mas sim com o problema em si. Acredito que mudar pra qualquer outra linguagem (sem utilizar técnicas de processamento paralelo e coisa do tipo) não iria melhorar muita coisa. De qualquer forma, é possível fazer muito disso em Java.
Inclusive existem vários frameworks de Redes Neurais pra Java, feitos em Java (o cara que escreveu o livro de RN que é azul clarinho inclusive fez um eu acho).
Não se preocupe, que no quesito processamento o hotspot é bem transparente, pois ele compila seu bytecode para código nativo e ainda o otimiza. A maior parte do problema de performance é o algoritmo e a lógica implementada.
Para notar a diferença entre um software c++(“bem implementado claro”) e um java você tem que estar em um cenário onde o tempo realmente é muito crítico(abaixo dos nanosegundos), como aplicações de vídeo, ou algum tipo de io(leitura no disco, etc…).
em 90% dos casos, java ou outra linguagem com memória gerenciada é a melhor opção.
Um amigo utilizou AGs para otimizar o COCOMO na sua pós graduação. Usou essa api(a melhor parte na minha opinião é implementar). http://jgap.sourceforge.net/
Quando falamos em desempenho em si, é certo que Java já não perde feio. A questão é que em algoritmos de otimização mais robustos, essa diferença de processamento pode ser multiplicada várias vezes. Já li que Java melhorou bastante, mas nas discussões sobre benchmark entre Java vs C++, por exemplo, a conclusão é que, para um mesmo problema, C++ geralmente consegue tempos melhores (mesmo que seja na gambiarra).
:idea: A minha conclusão sobre isso tudo é:
:arrow: Java pode ser utilizado para aplicações que o tempo não chega a ser um ponto crítico, como em heurísticas mais rápidas (guloso, SA, etc.) em aplicações do mundo real. Afinal, o cliente não vai reclamar se em vez de 10 o programa precisou de 11 segundos para encontrar a solução.
:arrow: No âmbito científico, onde cada segundo pode fazer diferença, C/C++ ainda continua a melhor opção. Acredito que frameworks que implementam algoritmos exatos de programação linear, por exemplo, continuem usando C/C++ por bastante tempo ainda.
Confesso que não conheço bem o Hotspot VM. Vou dar uma pesquisada.
Victinho, dê uma olhada nos artigos do Brian Goetz. Eu trabalhei com Java em ambiente de tempo real por 6 anos.
E, em muitos casos, o desempenho dele chegava a ser melhor do que o do C++.
Ok, a afirmação que “nós até conseguimos otimizar mais com C++” é até verdadeira. Mas raramente alguém está disposto a pagar tão caro por otimização, mesmo no caso de muitos sistemas de tempo real científicas. A ergonomia das duas linguagens é muito diferente, então, fica difícil comparar as duas.
Por exemplo, graças ao garbage collector, alocar e desalocar memória no heap é inúmeras vezes mais rápido do que usando o new e delete “puros” do C++. Ok, você poderia implementar seu próprio memory manager no C++ e superar o Java, mas esse é um custo altíssimo, que pouquíssimas empresas poderiam pagar. Lembre-se que o custo não está só na criação, mas na manutenção dessa solução e nos testes, já que quanto mais complexo o software, mais chances existem dele inserir riscos no processo.
Então a afirmação, embora correta, é geralmente inviável.
Foi exatamente esse exemplo que eu pensei quando falei em gambiarras.
É, cara, mas você há de convir que é muito difícil alguém deixar de usar C/C++ e passar a usar Java em aplicações com objetivos científicos, tendo em vista que determinadas situações são necessárias horas de processamento e o tempo, portanto, passa a ser um problema. Já está no inconsciente que Java é mais lento. Além disso, como você mesmo disse, C/C++ tem margem para melhorar, mesmo que seja por meio de gambiarras (as vezes algo nem tão custoso). Para aplicações mais “simples”, acredito que Java já seja sim uma alternativa.
Know how da equipe: se vc já tem um time acostumado com C ou C++, experiente na linguagem, e a linguagem atende bem, pq trocar para Java?
Interoperabilidade com legado: você provavelmente já vai ter várias bibliotecas, seja com funções de cálculo numérico, física, ou qualquer outra coisa que desenvolva, já escrita em C ou C++;
Existência de hardware específico: Como supercomputadores, ou hardware de baixo nível (para processamento de sinais, por exemplo). Nesse caso, é impossível usar a VM Java.
Uma gambiarra só não será “tão custosa assim” num trabalho de faculdade, onde não existe manutenção. Para aplicação séria, ela sai mais cara do que fazer o código direito. Afinal, ela é sujeita a bugs e, se complicar o código, terá que ser testada e mantida.
Foi exatamente esse exemplo que eu pensei quando falei em gambiarras.
É, cara, mas você há de convir que é muito difícil alguém deixar de usar C/C++ e passar a usar Java em aplicações com objetivos científicos, tendo em vista que determinadas situações são necessárias horas de processamento e o tempo, portanto, passa a ser um problema. Já está no inconsciente que Java é mais lento. Além disso, como você mesmo disse, C/C++ tem margem para melhorar, mesmo que seja por meio de gambiarras (as vezes algo nem tão custoso). Para aplicações mais “simples”, acredito que Java já seja sim uma alternativa.
Obrigado, ViniGodoy, pelas explicações e pelos links.
Abraços,
Victor[/quote]
A NASA mesmo usa java nas suas aplicações científicas. Ela só não usa onde realmente o tempo é critico mesmo, como nos foguetes e ônibus espacias. Em inteligência artificial, e visão artificial, ela usa java, e estes são usados para resolver problemas de busca e otimização, que é o caso do robô spirit em marte.
Só finalizando este assunto de gambiarra… eu acho que a gambiarra não é necessariamente algo que vai afundar um projeto. Eu penso que é apenas uma solução incomum ou fora dos padrões (?), com objetivo de preencher uma lacuna ou deficiência da ferramenta (ou do desenvolvedor). Geralmente, são altamente nocivas à saúde de um projeto, mas, em outras situações, podem ser tão engenhosas que tornam-se ótimas alternativas. Eu acho que a gente precisa ter a cabeça aberta.
[quote=ViniGodoy]
Eu vejo várias razões para a resistência:
Pré-conceito;
Know how da equipe: se vc já tem um time acostumado com C ou C++, experiente na linguagem, e a linguagem atende bem, pq trocar para Java?
Interoperabilidade com legado: você provavelmente já vai ter várias bibliotecas, seja com funções de cálculo numérico, física, ou qualquer outra coisa que desenvolva, já escrita em C ou C++;
Existência de hardware específico: Como supercomputadores, ou hardware de baixo nível (para processamento de sinais, por exemplo). Nesse caso, é impossível usar a VM Java.[/quote]
Concordo. 8)
[quote]
É, cara, mas você há de convir que é muito difícil alguém deixar de usar C/C++ e passar a usar Java em aplicações com objetivos científicos, tendo em vista que determinadas situações são necessárias horas de processamento e o tempo, portanto, passa a ser um problema. [/quote]
Concordo com o Vini, que na maioria das vezes, é puro preconceito.No geral, são pouquíssimas as aplicações que exigem REALTIME EXTREMO.Eu tô trabalhando atualmente num projetinho de P&D para uma elétrica e é java do início ao fim(implementando Fuzzy).
O problema da Gambiarra, é “quão” gambiarra ela é.Tem programadores que fazem um código tão ilegível, com tantas chamadas aninhadas, tanta função que chama outra, que até um especialista entender, vc perde um tempo que por vezes vc não possui em um projeto.
Eu terminei um estudo sobre quesito performance entre java e c#, e c++ para aplicações de vídeo e processamento de imagens em realtime. Nessa semana vou abrir um tópico e postar no guj. Vocês vão se surpreender.