etc./StackOverFlow

"B"를 인쇄하는 것이 "#"을 인쇄하는 것보다 훨씬 느린 이유는 무엇입니까?

청렴결백한 만능 재주꾼 2021. 11. 10. 07:35
반응형

질문자 :Kuba Spatny


1000 x 1000 의 두 행렬을 생성했습니다.

첫 번째 행렬: O# .
두 번째 행렬: OB .

다음 코드를 사용하여 첫 번째 행렬을 완료하는 데 8.52초가 걸렸습니다.

 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(""); }

이 코드를 사용하면 두 번째 행렬을 완료하는 데 259.152초가 걸렸습니다.

 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(""); }

극적으로 다른 실행 시간의 이유는 무엇입니까?


주석에서 제안한 대로 System.out.print("#"); 7.8871 초가 걸리는 System.out.print("B"); still printing... 제공합니다....

정상적으로 작동한다고 지적한 다른 사람들처럼, 예를 들어 Ideone.com 을 시도했고 두 코드 조각이 같은 속도로 실행됩니다.

시험 조건:

  • 나는 Netbeans 7.2 에서 이 테스트를 실행했고 그 콘솔에 출력을 냈다.
  • 측정을 위해 System.nanoTime() 을 사용했습니다.


순수한 추측 은 문자 줄 바꿈이 B 를 단어 문자로 # 을 단어가 아닌 문자로 취급하는 터미널을 사용하고 있다는 것입니다. 따라서 줄 끝에 도달하고 줄을 끊을 위치를 검색할 때 # 거의 즉시 그리고 행복하게 끊깁니다. 반면 B 를 사용하면 더 오래 검색해야 하고 줄 바꿈할 텍스트가 더 많을 수 있습니다(일부 터미널에서는 비용이 많이 들 수 있습니다. 예를 들어 백스페이스를 출력한 다음 줄 바꿈되는 문자를 덮어쓰기 위해 공백을 출력함).

그러나 그것은 순수한 추측입니다.


Community Wiki

Eclipse와 Netbeans 8.0.2에 대한 테스트를 Java 버전 1.8에서 수행했습니다. 측정을 위해 System.nanoTime() 을 사용했습니다.

식:

나는 두 경우 모두 같은 시간을 얻었다 - 약 1.564초 .

넷빈:

  • "#" 사용: 1.536초
  • "B" 사용: 44.164초

따라서 Netbeans는 콘솔로 인쇄할 때 성능이 좋지 않은 것 같습니다.

더 많은 연구를 한 후에 문제가 Netbeans의 최대 버퍼의 줄 바꿈 System.out.println 명령으로 제한되지 않음)이라는 것을 깨달았습니다. 이 코드는 다음과 같습니다.

 for (int i = 0; i < 1000; i++) { long t1 = System.nanoTime(); System.out.print("BBB......BBB"); \\<-contain 1000 "B" long t2 = System.nanoTime(); System.out.println(t2-t1); System.out.println(""); }

시간 결과는 시간 결과가 약 225밀리 초인 경우 매 5번째 반복을 제외하고 모든 반복마다 1밀리초 미만입니다. (나노초 단위):

 BBB...31744 BBB...31744 BBB...31744 BBB...31744 BBB...226365807 BBB...31744 BBB...31744 BBB...31744 BBB...31744 BBB...226365807 . . .

등등..

요약:

  1. Eclipse는 "B"와 완벽하게 작동합니다.
  2. Netbeans에는 해결할 수 있는 줄 바꿈 문제가 있습니다(Eclipse에서는 문제가 발생하지 않기 때문에)(B("B") 뒤에 공백을 추가하지 않고).

Roy Shmuli

예, 범인은 확실히 단어 줄 바꿈입니다. 두 프로그램을 테스트했을 때 NetBeans IDE 8.2는 다음과 같은 결과를 제공했습니다.

  1. 첫 번째 행렬: O 및 # = 6.03초
  2. 두 번째 행렬: O 및 B = 50.97초

코드를 자세히 살펴보면 첫 번째 루프의 끝에 줄 바꿈을 사용했습니다. 그러나 두 번째 루프에서 줄 바꿈을 사용하지 않았습니다. 따라서 두 번째 루프에서 1000자의 단어를 인쇄할 것입니다. 그로 인해 줄 바꿈 문제가 발생합니다. B 다음에 단어가 아닌 문자 " "를 사용하면 프로그램을 컴파일하는 데 5.35초밖에 걸리지 않습니다. 그리고 100개 값 또는 50개 값을 전달한 후 두 번째 루프에서 줄 바꿈을 사용하면 각각 8.56초7.05초밖에 걸리지 않습니다.

 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"); } if(j%100==0){ //Adding a line break in second loop System.out.println(); } } System.out.println(""); }

또 다른 조언은 NetBeans IDE의 설정을 변경하는 것입니다. 우선 NetBeans 도구 로 이동하여 옵션 을 클릭합니다. 그런 다음 편집기 를 클릭하고 서식 탭으로 이동합니다. 그런 줄 바꿈 옵션의 어느 곳을 선택합니다. 프로그램을 컴파일하는 데 거의 6.24% 더 적은 시간이 소요됩니다.

NetBeans 편집기 설정


Abdul Alim Shakir

출처 : http:www.stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing

반응형