Alternativa viável à JNI em um caso de uso

10 respostas
T

Olá amigos, o maior obstáculo que me impedia de aprender Java de fato, era a questão de desempenho, pois a parte de cálculos numéricos exige vitalmente desempenhos otimizados ao máximo.

A estratégia que eu encontrei se divide em duas partes :

  1. construir um executável para realizar os cálculos, formando uma engine, feita em qualquer outra linguagem como C ou mesmo Fortran e que receba e produza dados por meio de arquivos

  2. usar o Java para construir a parte “interativa” como interface gráfica, banco de dados, e até mesmo ferramentas para saída e entrada de dados em redes

Como um exemplo de uso desse sisteminha, poderíamos através do aplicativo Java em si, recuperar dados de um JDBC, jogar em um arquivo e chamar o executável (a engine) e alimentá-la com o arquivo gerado e depois coletar os resultados do executável (gerado em um arquivo) e trabalhar com eles mostrando na tela ou transferindo para um outro pc em rede.

Eu gostaria muito que os amigos experientes dessem as suas opiniões sobre essa idéia, se é prática, se é “aportuguesada” em relação ao uso de JNI, etc…

Estarei lendo e refletindo bastante sobre cada opinião e crítica, agradeço desde já a ajuda! :smiley:

10 Respostas

R

Se vc quer usar esse sistema pra aprendizado em java vai fundo… mas se for profissionalmente… eu não vejo ganho em utilizar java aí… pq vc precisa de performance nos teus calculos… e eu particularmente acho awt/swing um lixo (nunca futuquei o SWT, mas tb não acredito que seja algo completamente diferente)…

Se fosse web até faria sentido…

Bom, é minha opinião.

[]'s

agodinho

Cara, 10.

O próprio java já usa essa abordagem: dê uma olhada nos fontes da classe StrictMath - utilzada pela classe Math. Nela vc vai encontrar um monte de chamadas native (que é o quê vc está querendo fazer).

Contudo tenho de concordar com o amigo acima: GUI em java é um porre (SWING ou AWT, com o SWT da IBM é um pouquinho melhor).

Woody

peczenyj

Vc ja fez um benchmark da velocidade do Java e do Fortran nos cálculos que vc precisa fazer?

http://www.math.ucla.edu/~anderson/JAVAclass/JavaInterface/JavaInterface.html

T

olá Rafaelprp , sobre a questão de desempenho da interface em si, acho q não será muito problema porque vou usar Java também pra manipular os dados de entrada e saída, banco de dados, essas coisas

agodinhost, vou pesquisar mais a fundo a StrictMath, ainda estou em dúvidas pra saber sobre essas coisas nativas, teria q usar a JNI?

sobre o benchmark, peczenyj interessante o link , vou procurar alguma pesquisa pronta que inclua inclusive o Pascal, pois aqui tem uns programas de uns 15 anos atrás feitos nele, se souber de algum link interessante pra mandar aí pra gente eu agradeço

obrigado pela ajuda até agora amigos :smiley:

T

a) StrictMath na verdade, em termos de desempenho, é justamente o contrário (quando um método estático da classe StrictMath é chamado, como sin, então em vez de o JIT criar código para chamar a instrução do coprocessador aritmético que implementa o seno, com precisão de 80 bits (no x86 é o FSIN), ou a instrução SSE2 que implementa o seno, com precisão de 64 bits, ele cria uma chamada a uma rotina da JVM que implementa “manualmente” em C o seno com a precisão de 64 bits.
Então StrictMath é mais lenta em vez de ser mais rápida (embora a JVM da Sun use sempre StrictMath, a JVM da BEA usa StrictMath apenas quando você especificou strictfp na declaração do método ou variável. )

b) Se seus cálculos são altamente interativos, é melhor usar JNI ou então comunicação com um “servidor de cálculos”, escrito em Fortran, C ou sei lá que linguagem para fazer contas, que chamar um programa via Runtime.exec (é rápido no Unix mas lento no Windows devido à própria arquitetura do Windows).

c) java.math.BigInteger e BigDecimal antigamente usavam JNI mas foi descoberto que os usos típicos de BigInteger e BigDecimal, além da evolução da própria JVM e da lentidão da interface JNI, faziam com que fosse mais rápido implementar BigInteger e BigDecimal em Java puro em vez de JNI.

sergiotaborda

É um pouco estranho ( e até cliché) dizer que java é lento. Tudo é uma questão de usar a biblioteca certa e a tecnologia certa. Querer ser rápido é relativo. Precisamos saber quanto é “rápido”. Por isso um bentchmark seria o ideal

Mesmo como uma JVM de RealTime e o uso de API como a Javolution que apresentam performance superior a sintaxe ainda é java.

A sun está desenvolvento uma nova linguagem - Fortress ( http://research.sun.com/projects/plrg/faq/index.html ) - para transformar a plataforma java numa ferramenta para calculo.

JNI pode não ser a solução pois sua bibliotecas nativas não são portáteis.

Tudo depende muito do que vc quer fazer. Que tipo de calculo estamos falando , algoritmo utilizado e objetivo.
Faça um bentchmark antes de decidir.

T

olá thingol , achei muito rica a sua descrição e os cálculos são do tipo iterativos sim

sergiotaborda, pra ser mais específico, são problemas da área de pesquisa operacional, com enfoque na resolução de problemas de “programação” linear (para quem não souber: cálculos iterativos envolvendo a resolução de sistemas matemáticos - parecidos com aqueles sisteminhas que se aprende na escola - porém bem maiores e mais complexos, utilizando grandes matrizes pra encontrar as soluções ótimas)

e muito interessante o link sobre a Fortress !

obrigado de novo amigos

T

Acho que para pesquisa operacional você pode usar cálculos 100% Java.

Não vai ser muito mais lento que uma planilha Excel.

É só usar o JDK ou JRE mais recente que você conseguir, para aproveitar as otimizações que a JVM faz para processadores que implementam SSE2 e SSE3 (como os Core Duos ou os Pentium IV ou D, ou também os AMDs mais modernos).

Se fosse para previsão do tempo, aí você teria de usar algo mais poderoso que um simples computador pessoal.

T

Um "shortcoming" do Java é que não existem matrizes bidimensionais - existem vetores de vetores, que podem ser uma boa opção para representação de matrizes esparsas.

Se sua matriz não for esparsa, costumeiramente se usa a técnica de calcular manualmente o índice.

Digamos que você tenha uma matriz 4 x 5, cujos índices comecem por 1, e você quisesse somar todos os seus elementos. Em Java você gostaria que fosse algo assim:

double d[1:4,1:5]; // é claro que isto não é Java, mas estou dando um exemplo pseudo-Java
double soma = 0;
for (int i = 1; i <= 4; ++i) {
    for (int j = 1; j <= 5; ++j) {
        soma += d[i,j];
    }
}

Você teria de fazer algo como:

double d[] = new double [4 * 5]; // isto é Java de verdade
double soma = 0;
for (int i = 1; i <= 4; ++i) {
    for (int j = 1; j <= 5; ++j) {
        soma += d [(i - 1) * 5 + (j - 1)]; // sempre me confundo na hora dos multiplicadores...
    }
}

Já vou comentando que em C# há matrizes multidimensionais mas elas têm o problema de os índices sempre começarem por 0. O código C# equivalente seria:

double d[,] = new double [4,5];
double soma = 0;
for (int i = 0; i < 4 ; ++i) {
    for (int j = 0; j < 5; ++j) {
        soma += d [i, j];
    }
}

Você teria de revisar seus algoritmos para que os índices começassem por 0, o que pode ser desajeitado, subtrair 1 de todos os índices, outra coisa desajeitada, ou então deixar a linha 0 e a coluna 0 desocupadas, o que pode ser desperdício de memória.

T

é isso aí thingol, matriz é chato de se trabalhar mesmo :smiley: e costumam ser esparças sim, preciso ver alguma técnica eficiente pra lhe dar com elas economizando memória

achei legal essa idéia de poder usar o Java sem muitos problemas como você disse, em relação ao próprio Excel, obrigado pelos toques! :slight_smile:

Criado 11 de janeiro de 2008
Ultima resposta 16 de jan. de 2008
Respostas 10
Participantes 6