2012-06-06 2 views
6

데이터베이스에서 많은 입력 데이터를 읽고 조작 한 다음 다른 데이터베이스에 데이터를 다시 쓰는 Java 프로그램이 있습니다 (ODBC 드라이버를 사용하고 새 Windows 7 시스템에서 데이터베이스를 엑셀 및 액세스). 프로그램은 이클립스에서 실행하는 데 약 17 분이 걸리지 만 실행 가능한 .jar 파일을 만들면 실행하는 데 10 분 (총 27 개)이 소요됩니다.왜 내 .jar 파일이 eclipse의 프로그램보다 느리게 실행됩니까?

저조한 jar 파일 (SO와 Google 검색)에 대한 두 가지 이유는 압축되어 있고 명령 프롬프트 또는 오류 로그에 기록하는 데 시간이 오래 걸린다는 것입니다 이클립스에서 콘솔. 압축되지 않은 jar 파일을 만들려고 시도했지만 약 10 초 정도 빨라졌습니다 (실행 시간이 약 30 초마다 달라 지므로 완전히 무작위 였을 수 있습니다). 프로그램에 약 10 개의 System.out.println() 명령 만 있으므로 느려지지 않아야합니다.

어떤 아이디어로 실행 속도가 느리며 어떤 방식 으로든 다시 속도를 낼 수 있습니까? 내가 포함해야하는 다른 세부 사항이 있다면 알려주십시오. 감사!

+2

System.out.println() 명령을 모두 제거해 보셨습니까? 콘솔에 인쇄하는 것은 많은 속도를냅니다. –

+3

logger 또는 log4j 라이브러리를 사용하여 로그 메시지를 인쇄하고 타임 스탬프를 사용하여 병목 현상을 일으키는 코드 부분을 확인할 수 있습니다. 이것은 구체적인 해결책이 아니지만 문제의 범위를 좁히는 데 도움이됩니다. – user845279

+0

@Lai Xin Chu와 동의하십시오. 그러나 모든 인쇄물을 제거하는 것이 어려울 경우 프로그램을 실행하고 STDOUT을 파일로 리디렉션하십시오. 나는 이클립스 콘솔이 쉘보다 느리게 동작 할 수 있다고 생각하지 않는다. – AlexR

답변

4

JAMon을 사용하십시오. 모니터링 라이브러리이므로 코드 실행 시간을 측정하는 데 도움이됩니다.

메소드에 모니터링 코드를 추가 한 후 Eclipse 및 JAR 파일로 실행하고 결과를 비교하십시오. 이렇게하면 검색 범위를 좁힐 수 있습니다.

또한 다음과 같이하십시오. Eclipse에서 사용하는 것과 동일한 Java 버전으로 JAR 파일을 실행하는지 확인하십시오 (예 : Java 1.4.x가 1.6.x보다 훨씬 느릴 수 있음).

1

Java VM 매개 변수 (사용 된 GC, 최대 메모리 등)를 확인할 수 있습니다. 데이터 집약적 인 응용 프로그램의 경우 GC로 처리 속도가 느려질 수 있습니다.

2

필자의 경우 응용 프로그램을 실행하는 데 3 초가 걸렸지 만 항아리에서 실행하면 2 분이 걸렸습니다.
내 실수는 내 프로젝트를 실행 가능한 병으로 내보내는 동안 "Package required libraries into jar"을 선택하는 것이 었습니다.

난 당신이 다른 받는다는 종속성 또는 jar 파일을 프로젝트에이있는 경우 항아리로 프로젝트를 내보내는 동안 ..

, 당신은 "**Extract required libraries into generated jar**"를 사용해야 제외하고, 시간 아무것도하지만, 도움을 가져 오는 다양한 방법을 시도 .

이 문제는 초 단위로 해결되었습니다. & 이제 두 개의 응용 프로그램을 실행하는 데 동일한 시간이 걸리는 & jar 파일이 2 초 있습니다.

희망은 새로운 투쟁을 돕습니다.

감사합니다.

+1

이클립스에서 실행중인 것은 동일합니다. (거의 순간적입니다.) 항아리에서 프로세스는 4 분 뒤였습니다. 귀하의 제안은 내 문제를 해결했습니다 – benez

2

비슷한 문제가있었습니다. 쉘은 느린 속도로 실행되었고 콘솔 출력과 관련이 없습니다. JVM 메모리 값을 설정하려고했지만 아무런 차이가 없었습니다.

해결 방법은 "생성 된 라이브러리 옆의 하위 폴더에 필수 라이브러리를 복사하십시오."를 사용하여 모든 JAR이있는 ANT 파일을 외부 폴더에 패키지하는 것입니다. JAR "옵션을"Runnable JAR File Export "마법사에 추가하십시오. 그런 다음 -cp [YOURSUBFOLDER] 명령 행 옵션을 사용하여 기본 JAR을 실행하십시오.

+0

고마워요! 분명히 그것도 JavaFX의 FXMLLoader 클래스에 막대한 영향을 미쳤습니다. "포장 된 항아리"로 약 10 배 더 느리게 작동하고 파일이 이미 압축 해제 된 상태 였지만 ... – DragonGamer

+0

같은 결과가 나도 없었습니다. 매니페스트 파일은 이미 하위 JAR의 위치를 ​​지정하므로'-cp'가 필요합니다. – golimar

관련 문제