Eu gerei duas matrizes de 1000
x 1000
:
Primeira matriz: O
e #
.
Segunda matriz: O
e B
.
Usando o código a seguir, a primeira matriz levou 8,52 segundos para ser concluída:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("#");
}
}
System.out.println("");
}
Com esse código, a segunda matriz levou 259.152 segundos para concluir:
Random r = new Random();
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if(r.nextInt(4) == 0) {
System.out.print("O");
} else {
System.out.print("B"); //only line changed
}
}
System.out.println("");
}
Qual é a razão por trás dos tempos de execução dramaticamente diferentes?
Como sugerido nos comentários, a impressão System.out.print("#");
leva apenas 7.8871
alguns segundos, enquanto a System.out.print("B");
doação still printing...
.
Como outros que apontaram que isso funciona normalmente para eles, tentei o Ideone.com por exemplo, e os dois pedaços de código são executados na mesma velocidade.
Condições de teste:
- Fiz esse teste no Netbeans 7.2 , com a saída no console
- Eu usei
System.nanoTime()
para medições
java
performance
loops
for-loop
system.out
Kuba Spatny
fonte
fonte
Respostas:
Pura especulação é que você está usando um terminal que tenta fazer quebra de linha em vez de quebra de caractere e trata
B
como um caractere de palavra, mas#
como um caractere que não é palavra. Então, quando chega ao final de uma linha e procura um lugar para quebrá-la, vê uma#
quebra quase imediata e feliz; enquanto que com oB
, ele deve continuar pesquisando por mais tempo e pode ter mais texto para quebrar (o que pode ser caro em alguns terminais, por exemplo, na saída de backspaces, em seguida, na saída de espaços para substituir as letras que estão sendo quebradas).Mas isso é pura especulação.
fonte
B
resolução.System.out.println
não faz quebra de palavras; o que ele estava produzindo era a quebra de palavras (e o bloqueio, entãoSystem.out.println
tivemos que esperar).Eu realizei testes no Eclipse vs Netbeans 8.0.2, ambos com Java versão 1.8; Eu usei
System.nanoTime()
para medições.Eclipse:
Eu tive o mesmo tempo nos dois casos - em torno de 1.564 segundos .
Netbeans:
Portanto, parece que o Netbeans tem um desempenho ruim na impressão para o console.
Após mais pesquisas, percebi que o problema é quebra de linha do buffer máximo do Netbeans (não está restrito ao
System.out.println
comando), demonstrado por este código:Os resultados de tempo são inferiores a 1 milissegundo a cada iteração, exceto a cada quinta iteração , quando o resultado é de 225 milissegundos. Algo como (em nanossegundos):
E assim por diante..
Resumo:
fonte
Sim, o culpado é definitivamente quebra-cabeças. Quando testei seus dois programas, o NetBeans IDE 8.2 me deu o seguinte resultado.
Observando seu código de perto, você usou uma quebra de linha no final do primeiro loop. Mas você não usou nenhuma quebra de linha no segundo loop. Então, você imprimirá uma palavra com 1.000 caracteres no segundo loop. Isso causa um problema de quebra de linha. Se usarmos um caractere que não seja "" palavra após B, leva apenas 5,35 segundos para compilar o programa. E se usarmos uma quebra de linha no segundo loop após passar 100 valores ou 50 valores, leva apenas 8,56 segundos e 7,05 segundos, respectivamente.
Outro conselho é que, para alterar as configurações do NetBeans IDE. Primeiro de tudo, vá para Ferramentas NetBeans e clique em Opções . Depois disso, clique em Editor e vá para a guia Formatação . Em seguida, selecione Anywhere in Line Wrap Option. Levará quase 6,24% menos tempo para compilar o programa.
fonte