Recentemente (em pleno sábado a noite) acabei entrando em uma das muitas “discussões” envolvendo a linguagem Java (plataforma Java) e a linguagem C# (plataforma .NET). A discussão (que iniciou-se com a pontuação de que o Java estava atrasado em relação a seus adversários por não possuir algumas features importantes como: properties, delegates, etc.) consistia na polêmica: quem possui melhor desempenho – C# (e aí devemos entender o compilador C#) ou Java (compilador Java)? Após algumas argumentações de minha parte, do Márcio Althmann, Vinícius Quaiato e do Bruno Consul, surgiu então a ideia de escrever alguns posts, comparando o desempenho destas arquiteturas.
É importante deixar claro que, o objetivo destes posts não é dizer: “C# é melhor que Java” ou vice versa. É sempre bom lembrar que, o que define se a linguagem é “boa” ou “ruim” é um conjunto de fatores que, somados são maiores que o “achismo” de um ou outro desenvolvedor que se julga detentor da verdade. A situação problema, o domínio do desenvolvedor sobre a linguagem escolhida e o caminho apontado pela modelagem formam um tripé que representa por sí só, se a linguagem é ou não ótima e indica se deve ou não ser utilizada.
É importante observar também que, o fato de a aplicação X possuir melhor performance em relação a aplicação Y não necessariamente quer dizer que a tecnologia escolhida para X é a responsável por isso. Alguns fatores como: design da aplicação, recursos da linguagem utilizados, estratégia de acesso a dados escolhida, etc., impactam diretamente no desempenho final, não podendo portanto, ser utilizado como critério final para esta afirmação.
Diante disso, surge a pergunta: Qual a melhor estratégia então para medir de forma coerente a tecnologia que apresenta melhor desempenho (ou pelo menos aponta nesta direção)?
Em um bate-papo de alto de alto nível com o grande Bruno Consul (@bconsul), após a deliberação de vários aspectos em relação as plataformas, chegamos a definição de uma timeline de testes, na expectativa de que os resultados obtidos possam servir de norte para que você possa tirar suas próprias conclusões.
A lista abaixo apresenta a timeline de testes a serem impostos sobre as tecnologias em questão.
- Fase 1: Testes Matemáticos
Os compiladores das linguagens mencionadas anteriormente deverão ser submetidos a uma bateria de testes matemáticos, iniciando dos mais básicos (cálculo de sequências numéricas, fatoriais, Fibonacci, PI, etc.) passando pelo cálculo de números primos e chegando em multiplicação de matrizes de grandes dimensões. - Fase 2: Manipulação de Arrays e Strings
Os compiladores serão submetidos a testes sobre suas estruturas de dados nativas, tais como: Arrays, Listas, Strings, etc. - Fase 3: Manipulação e Acesso a Dados
Testar a performance das “linguagens” em relação ao acesso a dados (metodos de acesso e manipulação dos dados em bancos de dados relacionais). Bancos de dados orientados a objetos não serão considerados nestes testes. - Fase 4: Tecnologias Web
Testar os containers web na mesma plataforma com as mesmas estratégias de programação. - Fase 5: Algoritmos Gerais
Testar algoritmos diversos e observar o comportamento das tecnologias em questão quando impostas a execução de tais metodologias.
Por hoje é só. Fique ligado nos próximos posts do site, pois eles já trarão os resultados iniciais dos testes.
Reafirmamos: esperamos com estes posts ajudá-lo a obter maiores informações em relação as duas tecnologias e não afirmar que X é melhor que Y ou vice-versa.
Você pode ajudar a escrever esta série de posts enviando suas sugestões de testes e metodologias em geral. Se você possuir sugestões, por favor nos envie através de seus comentários, elas serão muito bem vindas.
Facebook
Twitter
Instagram
LinkedIn
RSS