Melhor performance para entrada de dados [RESOLVIDO]
17 respostas
D
diegohsi
Ola pessoal,
gostaria de saber de vcs, se alguem sabe me informar qual a melhor forma para entrada de dados levando em consideração a performance.
Seria a classe Scanner? (Creio que não)
Ou seria BufferReader(new InputStreamReader()) ?
Ou outra forma?
Digo isso pois vou participar da maratona de programação e estou a procura de dicas para melhorar o tempo de execução. E não quero utilizar C ou C++.
A menos que você tenha uma quantidade razoável de dados para entrar, não é para se preocupar com isso se você usar BufferedReader usando o segundo construtor (o que requer um valor para o tamanho do buffer).
V
Vinicius_Zibetti_Res
Olá meu amigo, resposta a sua pergunta:
Uma maratona de programação seria extremamente necessário a utilização de C++ ou mesmo C; Java é muito mais lento do que o C++ pelo motivo de que o Java é interpretado, tendo que passar antes para a JVM.
O C++ depois de compilado é direto em Assembler ou melhor, vai direto ao processador.
Se realmente você acha que é melhor usar Java na maratona, estude mais e deixe pra próxima maratona sabendo C++ ou C.
BufferedReader é mais rápido que o Scanner, mas se a quantidade de dados for pequena, o Scanner resolve fácil.
E
entanglement
Um dos problemas das maratonas de programação é que se você for usar Java você tem de pensar bem mais para evitar o uso de algoritmos de força bruta; além disso, o tempo de startup de um programa Java é considerável, e isso acaba pesando.
Para evidenciar esse problema, imagine que você tivesse um problema, em uma maratona de programação, que pudesse ser resolvido com o seguinte programa:
Qual dos dois programas entra no ar mais rapidamente? Obviamente o início do programa Java acima é bem mais lento (embora a execução do código escrito em si gaste mais ou menos o mesmo tempo.)
E
entanglement
Se o problema “em si” requerer apenas força bruta, não vejo porque existir grande diferença entre o programa em Java e em C. Como prova disso, podemos tentar achar os primeiros 16 bilhões de números primos usando o crivo de Eratóstenes em Java e em C. Acho que não vai haver uma diferença tão estúpida assim (talvez o programa Java use uma vez e meia o tempo do programa em C).
V
Vinicius_Zibetti_Res
entanglement, infelizmente o java demora muito mais, eu participo de competições de programação e sempre que me deparo com problemas do tipo brute force, o faço os testes de eficiencia.
Se em java roda em 35ms, C++ roda em 8ms, é mais ou menos assim.
Se for alguma coisa mais pesada o Java: 1s, C++: 225ms…
Eu mesmo ja fiz varios destes testes, sempre a mesma coisa.
E
entanglement
Pois é, uma boa parte desse tempo é porque o Java não conseguiu ter tempo para otimizar o código - como você disse, rodou por um segundo. Para achar 16 bilhões de números primos leva bem mais de 1 segundo, mesmo em C
Se você precisa de coisas que rodem por um bom tempo (que é o caso de programas que ficam rodando em servidores, como aplicações Web), então o Just-in-time Compiler faz um bom serviço.
Mas infelizmente o JIT não é adequado para maratonas de programação (onde, se você usar os algoritmos corretos, as coisas não devem rodar por mais que um segundo em um programa em C, C++ ou Delphi).
J
juliocbq
entanglement:
Pois é, uma boa parte desse tempo é porque o Java não conseguiu ter tempo para otimizar o código - como você disse, rodou por um segundo. Para achar 16 bilhões de números primos leva bem mais de 1 segundo, mesmo em C
Se você precisa de coisas que rodem por um bom tempo (que é o caso de programas que ficam rodando em servidores, como aplicações Web), então o Just-in-time Compiler faz um bom serviço.
Mas infelizmente o JIT não é adequado para maratonas de programação (onde, se você usar os algoritmos corretos, as coisas não devem rodar por mais que um segundo em um programa em C, C++ ou Delphi).
ótima resposta. Enquanto os compiladores estáticos já fizeram a otimização em tempo de compilação os dinâmicos como JIT necessitam de várias iterações para conseguir uma fazer uma estatística do desempenho do programa e posteriormente otimizá-los. Nesse quesito aí é uma desvantagem.
Em outros tipos problemas acaba sendo bem útil porque o resultado é bem satisfatório(assembly enxuto).
Mas tem uma coisa que eu não entendo. Não acho justo o uso de compiladores e linguagens diferentes em maratonas de programação. A competição deveria usar uma única tecnologia para analisar somente o nível dos competidores, pois a qualidade do compilador influencia(e bastante)
D
diegohsi
Muito obrigado a todos pelo esclarecimento.
bom, pela experiencia que vcs possuem, vou seguir as dicas, então vou relembrar e estudar um pouco de c++. Obrigado a todos. Há mais uma coisa,
Ja que muito de vcs participaram de maratonas utilizando C++, vcs poderiam me dar algumas dicas de classes/metodos/bibliotecas em C++ que poderia me ajudar na maratona. Digo em relação a manipulação de strings, vetores, list, …
J
juliocbq
diegohsi:
Muito obrigado a todos pelo esclarecimento.
bom, pela experiencia que vcs possuem, vou seguir as dicas, então vou relembrar e estudar um pouco de c++. Obrigado a todos. Há mais uma coisa,
Ja que muito de vcs participaram de maratonas utilizando C++, vcs poderiam me dar algumas dicas de classes/metodos/bibliotecas em C++ que poderia me ajudar na maratona. Digo em relação a manipulação de strings, vetores, list, …
pesquisei mais um pouco e vi que realmente usar java em maratona não dá. Como ja estudei C, entao vou utiliza-la em vez de C++. E dar uma relembrada nos nossos companheiros, ordenação, listas, filas, pilhas, arvore.
Vlw pessoal obrigado
E
entanglement
As maratonas de programação não têm também uma restrição de tempo (do tipo “você tem de resolver um problema em 2 horas” ou coisa parecida?)
Se você usar a STL do C++, pelo menos é possível economizar um bom tempo que você gastaria reimplementando árvores, filas, pilhas e listas Além disso, usando algumas dessas estruturas de dados prontas, você pode evitar o uso de algoritmos ineficientes que só seriam usados porque você não teve tempo de implementar uma estrutura melhor.
D
diegohsi
Pois é, eu sei o básico de C (inpu, output, ponteiros, string…), mais nunca mechi com C++. eu tenho 2 meses pra me preparar para a maratona, então o que seria melhor, utilizar C ou C++?
Não importa se eu sei mais isso do que aquilo, gostaria da opião de vcs experientes em maratona e nessas linguagens que eles utilizam.
E
entanglement
Se você tem 2 meses somente, e não tem um tutor que lhe ensine C++ “direitinho*”, é melhor você ir de C mesmo.
Já faz cerca de 17 anos que mexo com C++ (e ele é meu ganha-pão), mas ainda acho que não sei mexer direito com C++
Confesso que meus padrões para o que é “bom” em C++ são um pouco altos
D
diegohsi
entanglement:
Se você tem 2 meses somente, e não tem um tutor que lhe ensine C++ “direitinho*”, é melhor você ir de C mesmo.
Já faz cerca de 17 anos que mexo com C++ (e ele é meu ganha-pão), mas ainda acho que não sei mexer direito com C++
Confesso que meus padrões para o que é “bom” em C++ são um pouco altos :)
entao cara, mais é o seguinte,
suponhamos que eu saiba strings, ponteiros, ordenação, fila, pilha, lista, arvores em C, e um pouco de POO (em java - nivel da certificação OCJP). Para resolver problemas da maratona esses 2 meses não estaria de bom tamanho? Vendo que meu ponto de vista é diferente do seu pois vc é mais experiente claro.
Desculpe se estou sendo meio chato.
J
juliocbq
diegohsi:
entanglement:
Se você tem 2 meses somente, e não tem um tutor que lhe ensine C++ “direitinho*”, é melhor você ir de C mesmo.
Já faz cerca de 17 anos que mexo com C++ (e ele é meu ganha-pão), mas ainda acho que não sei mexer direito com C++
Confesso que meus padrões para o que é “bom” em C++ são um pouco altos :)
entao cara, mais é o seguinte,
suponhamos que eu saiba strings, ponteiros, ordenação, fila, pilha, lista, arvores em C, e um pouco de POO (em java - nivel da certificação OCJP). Para resolver problemas da maratona esses 2 meses não estaria de bom tamanho? Vendo que meu ponto de vista é diferente do seu pois vc é mais experiente claro.
Desculpe se estou sendo meio chato.
O que acontece é o seguinte:
A linguagem c é a que possui o menor runtime(natural porque é uma linguagem de médio nível), então você tem a vantagem de poder criar programas que utilizam pouca memória, e em alguns casos na maratona você vai sair ganhando com isso. Em contra partida c está bem próximo do assembly e você terá que lidar com estruturas de dados a nível de apontadores, e também implementar a maioria delas. Isso quer dizer que você tem maior responsabilidade com a qualidade da sua solução.
Com c++ você já possui a stl( standard template library) em seu favor, além da linguagem ser de alto nível e orientada a objetos. O runtime é um pouco maior que o da linguagem c e os compiladores são realmente muito bons(otimizam o resultado de maneira impressionante). Na minha opinião eu escolheria uma linguagem de alto nível que não tenha runtime alto como c++ ou pascal.