regis_hideki:
Chuto eu que os bytes estão indo para algum buffer, dessa forma, como o processo de debug possui pausas, dá tempo do buffer despachar o que precisa ser printado.
regis_hideki,
Não sei afirmar se os bytes vão para um buffer. Porém fiz alguns testes em relacao ao tempo que o "buffer" demora pra despachar.
O teste:
Necessário saber:
O meu codigo foi escrito para selecionar apenas os nomes que comecam com tal letra e mostra-los na coluna correspondente a essa letra. Como foi dito no primeiro post.
Para fazer a declaracao dos nomes declarei um vetor nomes com 26 posicoes. São 26 posicoes porque no alfabeto portugues brasileiro tem essa quantia de letras.
A selecao dos nomes de acordo com as letras e feita no codigo abaixo.
Objetivo:
Medir o tempo que a JVM demora para comparar e imprimir no console as saidas determinadas.
Como foi feito:
Nesse codigo incorporei a funcao System.nanoTime para medir o tempo e descobrir o tempo que a JVM demora para fazer a comparacao e imprimir no console a letra inicial da String e o nome correspondente.
Importante saber:
Como o codigo vai comparar cada String com cada letra do alfabeto, devemos saber que um nome que comece com a letra A vai demorar menos tempo para ser processado pela JVM do que um nome que comece com Z.
Assim, segue o codigo e sua saida:
O codigo:
for(x = 0; x < nomes.length; x++){
for(y = 0; y < alfabeto.length; y++){
if(nomes[x].startsWith(String.valueOf(alfabeto[y]), 0)){
long time0 = System.nanoTime();
System.out.printf("|%c = %s\t", alfabeto[y], nomes[x]);
long timeF = System.nanoTime();
long variationTime = timeF - time0;
System.out.print(variationTime + "ns\n");
}
}
As Saidas em nano segundos
|A = A 1601024ns
|B = B 114847ns
|C = C 108005ns
|D = D 108005ns
|E = E 108494ns
|F = F 108983ns
|G = G 121200ns
|H = H 109471ns
|I = I 108005ns
|J = J 108494ns
|K = K 108495ns
|L = L 111426ns
|M = M 108495ns
|N = N 110449ns
|O = O 108494ns
|P = P 107517ns
|Q = Q 109960ns
|R = R 111916ns
|S = S 109961ns
|T = T 111915ns
|U = U 109961ns
|V = V 109472ns
|W = W 108983ns
|X = X 110449ns
|Y = Y 109960ns
|Z = Z 110938ns
|A = Alice 192064ns
|B = Bruna 151012ns
|C = Carlos 185711ns
|D = Daniela 155411ns
|E = Erika 151012ns
|F = Fabiano 149057ns
|G = Gustavo 144171ns
|H = Hermes 152967ns
|I = Italo 144659ns
|J = Joao 143192ns
|K = Katia 143682ns
|L = Laura 144659ns
|M = Mariana 146125ns
|N = Nara 144170ns
|O = Otavio 143682ns
|P = Patricia 143192ns
|Q = Quércia 143193ns
|R = Romario 144170ns
|S = Sara 146614ns
|T = Tulio 207703ns
|U = Uiara 150034ns
|V = Victoria 143681ns
|W = Walda 144171ns
|X = Xavier 189621ns
|Y = Yuri 151012ns
|Z = Zed 142705ns
Conclusão:
Se houver realmente um tempo para o "buffer" despachar alguma coisa para o console, este tempo para saidas curtas esta na faixa dos nano segundos.
Duvida em relacao ao teste:
Se o codigo foi escrito para pegar apenas a primeira letra do nome e comparar com o alfabeto. Porque na saida 2, quando declarei nomes a JVM demorou mais do que na saida1 quando declarei somente letras?
Gustavo.foa:
Como não fala nada na API do Java, pode ser que o printf não seja Thread Safe, isso explicaria o comportamento estranho.
Tambem acho que printf pode não ser Thread Safe.
Porem, me surgiu uma duvida.
Qual a funcao do Syncronized e quando usa-lo?
Se este syncronized é para sincronizar duas acoes diferentes """thread""" e suponhamos que printf e nao seja thread safe. Como poderia isso ocorrer de maneira "Safe" se printf nao foi feito para isso?