2014-09-25 4 views
0

JAR로 컴파일 된 일부 기존 Java 코드가 있습니다. 이것은 Scala 프로젝트의 클래스 패스에 포함되어 있으며 Scala에서 java 메소드 중 일부를 호출하고있다. 이것은 Java 1.7, Scala 2.11.2 및 Eclipse의 Scala IDE 내 모든 것입니다.scala에서 호출 된 Java 메소드는 천천히 실행됩니다.

예 :

여기
def step[Ctx] = Locality.stepFn[SubProblemBSolution, Ctx] { (x : SubProblemBSolution) => x.mutate } 

, SubProblemBSolution은 돌연변이 체() 메소드 자바 클래스이다. 나머지는 스칼라입니다. 이 방법은 이미 Java에서 오래 실행 중이며 (평균 실행 횟수가 약 1000 회를 넘는 경우 약 0.5 초) Scala에서 호출 할 때 완료하려면 약 2.5 초가 소요됩니다.

jar가 스칼라 용으로 다시 컴파일되지 않습니다. 기존 컴파일 된 클래스를 호출하고 있습니다. 스칼라 .class 파일을 디 컴파일하여 그들이 이상한 것을보고 있는지 확인했지만, 그들은 단지/컴파일 된 코드/java 코드에 대한 호출이 있습니다.

왜 이렇게 느리게 움직이는 지 알기 원하십니까? 상황을 개선하기 위해 무엇인가 할 수 있습니까?

감사합니다.

+0

실행시 천천히 실행해야하는 이유는 전혀 없습니다. 단지 유사한 바이트 코드입니다. 처음으로 클래스 로더가로드 할 때 네이티브 라이브러리가로드되었다고 의심되면 처음 사용시 시간이 걸릴 수 있습니다. – Jatin

+0

[java 온라인 디 컴파일러] (http://jd.benow.ca/)를 사용해보십시오. "라이브 데모"가 보일 때까지 페이지 하단으로 스크롤하십시오. – Aivean

+0

함수에 동일한 값을 전달하고 있다고 확신합니까? 같은 문제를 해결할 때처럼? – ziggystar

답변

1

스칼라에서 전화를 거는 방법이 중요 할 수 있습니다.

특히 개체 및 정적 초기화 프로그램을 사용하지 마십시오. 즉, 클래스 초기화 중에 실행되는 객체 생성자의 일부로 값 비싼 계산을 실행하지 마십시오. 그것은 최적화되지 않은 채 실행되는 경향이 있습니다.

오래된 문제인 here 및 특히 here이 증상이 있습니다.

+0

감사. 이것은 문제 일 수 있습니다. 회피 할 수있는 정적 코드가 있습니다. mutate()는 x의 복사본을 생성 한 다음 반환되기 전에 몇 가지 변경 사항이 적용되었습니다. 나는 이것들에 초점을 맞추고 곧 진행 상황을 업데이트 할 것입니다. –

0

다소 불만스럽게도이 문제는 Scala IDE에서 새 프로젝트를 만들고 모든 것을 다시 가져 오는 것으로 해결되었습니다. 이 새로운 프로젝트를 이클립스로 가져올 때조차도 자바 메소드 호출 속도는 최고 속도로 진행되었다. 두 개의 프로젝트 (.classpath와 .project 파일의 diff'ing 포함)를 볼 때 분명히 다른 것을 볼 수는 없지만, 어딘가에 config에 숨어있는 뭔가가 있어야합니다.

@ som-snytt의 대답에 따라 개선 된 일부 정적 참조를 제거하려고했지만 큰 차이는 새 프로젝트를 만들 때 발생했습니다.

관련 문제