Você está na página 1de 4

Comparacao entre Java e C++ na Computacao Num rica e

Claudio Schepke, Andrea Schwertner Char o a Universidade Federal de Santa Maria Laborat rio de Sistemas de Computacao o Inform tica/CT - UFSM Campus - 97105-900, Santa Maria, RS a {schepke, andrea}@inf.ufsm.br Resumo
A computacao num rica e uma importante ferra e menta para a solucao de problemas nas areas cientcas e da engenharia. Muitas aplicacoes nestas areas re querem a resolucao de grandes sistemas lineares de forma r pida e eciente, geralmente atrav s de m todos a e e num ricos iterativos. A programacao orientada a obe jetos torna a implementacao desses m todos mais sim e ples, uma vez que permite codicar um algoritmo em um nvel de abstracao bastante pr ximo a formulacao ma o ` tem tica do m todo. O presente artigo apresenta uma a e comparacao entre as linguagens Java e C++ para a resolucao da equacao de Laplace atrav s do m todo itera e e tivo do Gradiente Conjugado. Tal comparacao contribui, principalmente, para ressaltar as vantagens e desvantagens destas linguagens no contexto da computacao ci entca de alto desempenho. diferencas entre si, tanto em relacao a seus recursos para o desenvolvimento de programas, como tamb m ao deseme penho na execucao do c digo resultante. o Este artigo tem por objetivo apresentar uma comparac ao entre as linguagens Java e C++ no contexto da computac ao cientca de alto desempenho. Para isso, foi escolhido um problema recorrente em muitas aplicacoes cientcas: a resolucao da equacao de Laplace atrav s do m todo e e num rico do Gradiente Conjugado. As proximas secoes e tratam do uso da orientacao a objetos aplicada a m todos e num ricos, do uso de Java para o alto desempenho e, e nalmente, apresentam a descricao da implementacao e os resultados obtidos.

2. Uso da orientacao a objetos para o c lculo a num rico e


Uma vasta gama de fen menos fsicos pode ser modeo lada atrav s de equacoes diferenciais parciais, sendo ree solvveis numericamente com o auxlio de t cnicas de e discretizacao. A utilizacao destas t cnicas resulta geral e mente em um sistema linear de equacoes alg bricas, cuja e solucao pode ser determinada atrav s de m todos di e e retos ou iterativos [7]. A programacao eciente destes m todos de resolucao de sistemas n o e uma tarefa trie a vial, mas atualmente pode-se contar com uma variedade de bibliotecas que facilitam sua utilizacao [12] [3]. No de senvolvimento destas bibliotecas, um dos paradigmas que se revelam adequados e a programacao orientada a obje tos [8]. A orientacao a objetos traz consigo algumas ca ractersticas interessantes para o desenvolvimento de aplicacoes de c lculo num rico. Uma das vantagens est a e a no fato de que os problemas podem ser considerados objetos. Desta forma, os dados representam os atributos e os m todos num ricos aplicados representam as funcioe e nalidades. J o uso de classes facilita a organizacao do a c digo-fonte. Assim os m todos podem compartilhar cao e ractersticas para a solucao de um problema, sem a ne

1. Introducao
` A computacao cientca est geralmente associada a a resolucao de diversos problemas nas areas das ci ncias na e turais e exatas, bem como nas engenharias. Exemplos deste tipo de problemas incluem o c lculo do deslocamento esa telar, a simulacao de determinadas condicoes clim ticas da a terra, a descoberta de novos medicamentos, o teste da aerodin mica de carros e avi es e a determinacao de locais a o vi veis para uma possvel extracao de petr leo [1]. Todas a o estas aplicacoes requerem processamento de alto desempe nho, o que depende fortemente da combinacao de hardware e software utilizados. A programacao orientada a objetos e uma opcao para o desenvolvimento de aplicacoes que resolvem proble mas modelados matematicamente. Em particular, este paradigma favorece a construcao de programas em um nvel ` de abstracao pr ximo as formulacoes matem ticas. No en o a tanto, as linguagens que seguem este paradigma possuem

cessidade de replicacao de trechos de c digo. Tamb m o e o encapsulamento ajuda na minimizacao da interde pend ncia entre as partes do codigo, ocultando detalhes de e implementacao.

3. Java e Alto Desempenho


O desempenho n o foi originalmente considerado um a fator relevante no desenvolvimento da linguagem Java. De fato, geralmente aponta-se como principais caractersticas desta linguagem a orientacao a objetos, o suporte ` a distribuicao, a seguranca e a portabilidade. Mesmo as sim, mudancas v m ocorrendo para poder-se usufruir e dos pontos fortes da linguagem e, ao mesmo tempo, obter uma melhora da eci ncia do c digo gerado [13]. e o Em geral, a opcao pelo uso de Java ocorre principal ` mente para programas em rede e em especial a Web. O uso de Java no processamento cientco possui al guns limitantes [5], sendo que um deles e a falta de arrays de v rias dimens es com um formato regular. No caso da a o implementacao de uma matriz num rica, e necess rio uti e a lizar uma estrutura de vetor de vetores. E importante notar que operacoes com matrizes de grande porte aplicadas ` a algebra linear s o algumas das operacoes mais comuns e a com maior custo computacional em aplicacoes cientcas. Outra caracterstica que tem impacto no desempenho de Java e a vericacao de excecoes, que garante robustez aos programas escritos nesta linguagem. Devido ao tempo ` destinado a realizacao dessa tarefa, geralmente ocorre uma perda de desempenho na execucao geral de um programa. Java faz a vericacao de ponteiros que estejam apontando para regi es de mem ria n o alocadas ou ultrapassando os o o a limites pr -denidos de um vetor. Tamb m o coletor de lixo e e consome um tempo signicativo do perodo de execucao, mas oferece uma vantagem ao programador, pelo fato dele n o precisar liberar explicitamente a memoria. a Uma terceira caracterstica a ser levada em conta no con texto da computacao cientca est na n o exist ncia de es a a e truturas simples que possibilitam o trabalho com n umeros complexos e operadores matem ticos especcos. A a solucao adotada e a utilizacao de classes especiais para a representacao de objetos cujos tipos n o estejam de a nidos como padr o da linguagem e a implementacao de a m todos especcos, como nas operacoes utilizadas soe bre matrizes e vetores. Para atender as necessidades de determinados grupos de programadores, j foram criados a pacotes especializados, como os que possibilitam o traba lho com algebra linear e funcoes matem ticas com um alto a nvel de abstracao sobre os dados manipulados [4]. Re centemente, foram feitas algumas melhorias em Java para a geracao de c digo eciente. Inicialmente, os byteco o des gerados na compilacao se tornaram mais especcos, para, em seguida, poderem ser compilados para a arquite-

tura nativa na primeira execucao do c digo. Atualmente, os o compiladores permitem gerar codigo de m quina, diretaa mente do c digo-fonte Java, para uma determinada arquiteo tura, sendo possvel encontrar v rios compiladores para este a m. Uma solucao alternativa est na possibilidade de se a rem feitas chamadas de m todos nativos, implementados e em outra linguagem, dentro do codigo Java (JNI - Java Native Interface). Outra melhoria est na tentativa de diminuicao do tempo a de comunicacao entre processos. Uma das possveis for mas est na utilizacao de um c digo RMI (Remote a o Method Invocation) mais eciente [8]. Soluc oes como o RMI assncrono n o bloqueiam os processos nas chama a das de funcoes remotas, algo que permite mascararo tempo de comunicacao no caso de sistemas distribudos. Existem tamb m implementacoes para uma M quina Vire a tual Distribuda, que oculta do usu rio a exist ncia de a e v rios n s-processadores. Seu uso permite um grande paa o ralelismo, j que os diversos uxos de codigo podem ser a executados sobre diversos processadores. Ainda na area de paralelismo, uma das id ias mais recene tes e a computacao em grids [9]. O objetivo, neste caso, e permitir o processamento remoto em m quinas ociosas disa ponveis de diversos lugares, enviando e recebendo tarefas e respostas por rede, para que grandes quantias de dados sejam processadas. O uso de Java na implementacao de pro gramas de gerenciamento de grids e um campo de pesquisa e desenvolvimento bastante ativo atualmente.

4. Comparacao entre Java e C++


Esta secao visa apresentar uma comparacao entre os tem pos de execucao de duas vers es (Java e C++) de uma o mesma aplicacao. O objetivo desta comparacao e apresen tar uma diferenca pr tica existente na simulacao de um a c digo e, em especial, do m todo do Gradiente Conjuo e gado, n o buscando fazer uma an lise te rica do custo das a a o operacoes, j que estes foram amplamente discutidos [2]. a No passado foram feitas diversas comparacoes com base no tempo de execucao de cada uma das operacoes [11]. E pre ciso, entretanto, contextualizar as mudancas feitas, tanto na implementacao, com o uso de bibliotecas especcas, como na geracao de c digo por parte dos compiladores, anali o sando as suas principais partes. A comparacao feita neste trabalho tem como base uma aplicacao cuja nalidade e determinar a solucao de um problema modelado pela Equacao de Laplace, utilizando o m todo do Gradiente Conjugado (GC) [7]. Esse m todo e e explora as propriedades das matrizes sim tricas, positie vas, denidas e, em especial, as matrizes esparsas, sendo um dos m todos num ricos iterativos mais utilizados. Suas e e operacoes se concentram em torno de operacoes entre ve tores, matrizes e vetores, e escalares com vetores. A cada

iteracao s o feitas duas operacoes entre matrizes e vetores, a tr s produtos internos e tr s atualizacoes de vetor. O m todo e e e tem como caracterstica a r pida converg ncia. a e Dentre as bibliotecas existentes para operac oes com algebra linear para Java, foi escolhida a biblioteca JMP [10], vers o 0.7.1, totalmente implementada nesta lina guagem. As principais caractersticas de JMP se referem ao seu uso de matrizes esparsas, o oferecimento de soluc oes paralelas para as operacoes com matrizes e vetores, espe cialmente o BLAS (Basic Linear Algebra Subprograms), a disponibilidade de diversos pr -condicionadores, a fae cilidade para leitura de vetores e matrizes, bem como a possibilidade de decomposicao, al m de outros recur e sos para a criacao de programas. J para a implementacao a em C++, foi escolhida a biblioteca SparseLib++ [6], vers o 1.5. O foco principal de SparseLib++ s o as esa a truturas de dados e o suporte computacional a m todos e iterativos. A m de propiciar uma execucao eciente des tes m todos, esta biblioteca possui uma vasta gama de e formatos de armazenamento, como estruturas para matri zes e vetores compactados, o que pode diminuir o n umero de operacoes a serem aplicadas, bem como possibili tam ao programador optar por um formato que melhor se adapta ao problema. Tamb m existem m todos de leie e tura para diversos formatos de compress o. a Para ns de comparacao, foram gerados tr s c digos exe e o cut veis: C++, Java bytecode e Java compilado para c odigo a nativo. O c digo escrito nas duas linguagens e bastante seo melhante, mudando apenas a forma como as bibliotecas resolvem o sistema. Para o c digo C++ foi usado o compilao dor GNU G++/GCC, vers o 3.3.2. Para o c digo em Java a o foi utilizado o compilador Javac, com o JDK 1.4.02, e o compilador GNU GCJ/GCC, vers o 3.3.2, para a geracao a de c digo nativo. o Os testes foram realizados em um computador com pro cessador Intel Celeron de 1 GHz e memoria de 128 MB. As matrizes utilizadas foram de 2.000 por 2.000, 20.000 por 20.000 e 200.000 por 200.000 elementos. Apos as execucoes, obteve-se as m dias das 10 execucoes realiza e das para cada caso, sendo que o desvio padr o se apresena tou baixo. Em termos de medicao dos tempos de execucao, o pro grama foi dividido em tr s partes. Na primeira parte, e e medido o tempo de inicializacao das vari veis e o preen a chimento dos vetores e matrizes. Em seguida, e calculado o tempo para a fase do pr -condicionamento. O pr e e condicionamento consiste em simplicar a matriz, para que as operacoes feitas pelos m todos num ricos possam con e e vergir de modo mais r pido. Sem o pr -condicionamento, a e os m todos seriam mais custosos para a aquisicao da e solucao. Para esta aplicacao, o pr -condicionador es e colhido foi a fatorizacao LU incompleta [7]. Por m, o m dulo em que se tem o maior interesse e a parte o

em que h a aplicacao do m todo do Gradiente Conjua e gado. Al m destas tr s regi es foi medido o tempo total de e e o execucao. Todos esses resultados est o apresentados nas ta a belas e no gr co a seguir. a Tabela 1 - Tempos de execucao com C++ C++ Inicio Precond M todo GC e Total 2000 0.05012 0.00442 0.00521 0.06196 20000 0.63963 0.04990 0.07280 0.76465 200000 6.44687 0.49968 0.72616 8.14305

Tabela 2 - Tempos de execucao com Java compilado Java Compilado Inicio Precond M todo GC e Total 2000 0.0105 0.0552 0.0243 0.0908 20000 0.1402 12.1857 0.2198 12.5467 200000 1.0903 1823.1154 1.9792 1826.1864

Tabela 3 - Tempos de execucao com Java bytecode Java bytecode Inicio Precond M todo GC e Total 2000 0.0953 0.2807 0.069 0.4898 20000 0.7638 16.0573 0.7331 17.6046 200000 7.1611 1893.0888 6.8919 1907.2011

8 7 6

C++ JavaCompilado JavaBytecode

Tempo (s)

5 4 3 2 1 0 2000 20000 200000 Dimenso da Matriz

Figura 1. Comparacao entre os tempos de execucao do metodo GC

5. Discuss o dos Resultados a


O desempenho apresentado na comparacao entre o m todo do Gradiente Conjugado, nas tr s execucoes, apree e senta bons resultados no uso de Java compilado para ` c digo nativo. A medida que aumenta o n mero de elemeno u tos da matriz, aumenta tamb m a relacao de eci ncia de e e Java compilado sobre Java bytecode e C++ para o m todo e em quest o, ainda que a execucao de C++ seja a mea lhor. J os tempos de inicializacao s o semelhantes para a a Java bytecode e C++, melhorando para o codigo Java compilado, o que mostra um maior esforco por parte da implementacao C++, para a criacao das estruturas com as informacoes. O pr -condicionamento, entretanto, e uma etapa que se e mostra bastante penosa para a implementacao em Java. O uso de pr -condicionadores e fundamental para uma r pida e a converg ncia dos m todos num ricos, j que os mesmos e e e a servem para se obter um bom valor inicial para a resposta. Bons pr -condicionadores conseguem diminuir bastante o e tempo a ser gasto pelo m todo iterativo. Todavia, um grande e ` n mero de operacoes precisa ocorrer para tanto. Devido as u estruturas especiais de armazenamento disponveis na bi blioteca SparseLib++, no que diz respeito a matrizes esparsas, como tamb m o fator natural do desempenho de C++ e ser melhor de modo geral, o tempo do pr -condicionamento e apresentou-se bem menor para este caso.

caractersticas a serem melhoradas nas linguagens, poder o a apresentar resultados signicativos para os pr oximos anos. Todavia, uma solucao mais usual pode ser o processamento paralelo para a obtencao de resultados em um tempo com putacional menor.

Refer ncias e
[1] G. R. Andrews. Foundations of Multithreaded, Parallel, and Distributed Programming. Addison-Wesley, US, 2001. [2] M. Bergman and P. Sloot. Basic Linear Algebra Subsystems. 1993. Dept. of Comp. Sys., Univ. of Amsterdam, number CAMAS-TR-2.1.2.1, Department of Computer Systems, University of Amsterdam, The Netherlands. [3] R. Boisvert and R. Pozo. JavaNumerics, 2004. http://math.nist.gov/javanumerics. [4] R. F. Boisvert, J. J. Dongarra, R. Pozo, K. A. Remington, and G. W. Stewart. Developing numerical libraries in Java. 1998. http://www.cs.ucsb.edu/conferences/java98/papers/jnt.pdf. [5] G. G. H. Cavalheiro. Princpios da Programacao Concor rente. ANAIS, Segunda Escola Regional de Alto Desempenho - Sociedade Brasileira de Computacao - Instituto de In form tica da UFRGS / UNISINOS / ULBRA, 2002. a [6] J. Dongarra, R. Pozo, K. Remington, X. Niu, and A. Lumsdaine. A sparse matrix library in C++ for high performance architectures. 1994. ftp://gams.nist.gov/pub/pozo/papers/sparse.ps.Z. [7] J. J. Dongarra, L. S. Duff, D. C. Sorensen, and H. A. Van der Vorst. Numerical Linear Algebra for High-Performance Computers. SIAM, 1998. [8] J. Farley. Java Distributed Computing. OReilly, 1998. [9] I. Foster and C. Kesselman. The Grid: Blueprints for a New Computing Infrastructure. Morgan Kaufmann, 1999. [10] B. O. Heimsund. JMP - A sparse matrix library for Java, 2004. http://www.math.uib.no/ bjornoh/jmp/index2.html. [11] A. G. Hoekstra, P. M. A. Sloot, M. J. De Haan, and L. Hertzberger. Time complexity analysis for distributed memory computers - Implementation of a parallel Conjugate Gradient method. 1991. In J. van. Leeuwen, editor, Computing Science in the Netherlands, pages 249-266. Elsevier Science. [12] T. Veldhuizen. The Object-Oriented Numerics Page, 2004. http://www.oonumerics.org/oon. [13] P. Wu, S. Midkiff, J. Moreira, and M. Gupta. Efcient Support for Complex Numbers in Java. 1999. http://www.cs.ucsb.edu/conferences/java99/papers/53wu.pdf.

6. Conclus o a
A utilizacao da orientacao a objetos para operacoes re ` lacionadas a computacao num rica mostra-se como um re e curso de programacao vi vel atrav s do uso de algumas bi a e bliotecas. Atualmente existem muitas bibliotecas em C++ voltadas para o uso cientco. Muitas delas s o amplamente a utilizadas e j foram alvo de otimizacoes. Este e o caso a da SparseLib++, uma biblioteca que possui uma excelente implementacao para as operacoes com matrizes esparsas. O uso de Java como uma linguagem de programacao para aplicacoes cientcas tem-se mostrado como uma opcao, apresentando a portabilidade e a abstracao ori entada a objetos como ponto forte. Mesmo assim, as bibliotecas em Java podem ainda ser consideradas escassas e as existentes s o geralmente implementadas a para aplicacoes especcas. No caso da biblioteca JMP, a mesma ainda est em desenvolvimento, sofrendo consa tantes revis es e incremento de funcoes. No entanto, seu o desempenho ainda se apresenta inferior ao que e exigido pela computacao cientca. Cabe destacar que, no momento, existem muitas bibliotecas em desenvolvimento, tentando abranger mais funcionalidades [3]. A otimizacao de c digo na compilacao, as melhorias na o implementacao nas funcoes de baixo nvel, bem como as