2014-01-10 3 views
4

현재 프로젝트 (OpenGL Voxel Engine)에서 모델을 생성 할 때 심각한 문제가 있습니다. 저는 매우 정교한 객체 지향 구조를 가지고 있습니다. 즉, 정점의 단일 매개 변수도 Object입니다. 이 방법으로 약 5 초 동안 750 복셀에 대해 약 75000 Object을 만듭니다. 새 Object을 할당 할 때 Java가 실제로 느리게 동작합니까? 아니면 내 코드의 어딘가에서 큰 실패를 놓칠 수 있습니까?객체 생성시 Java 속도가 느립니까?

+0

개체 유형에 따라 다릅니다. –

+0

개체 유형을 사용 중이기 때문에? – esmoreno

+3

코드를 사용하여 표시하십시오. –

답변

3

매우 큰 질문입니다. 일반적으로 객체 클래스 정의와 객체 생성에 필요한 작업량에 따라 다릅니다.

일부 문제 :

  1. 피하기 마무리 방법, 과도한 GC 활동을 피하기 위해
  2. 조정 메모리와 GC,
  3. 중에 동기화 해 전화를 사용하지 않는
  4. 생성자 동안 큰 일을하지 않도록, 객체 건설,
  5. 약한 참조

이러한 문제가 내 문제를 해결했습니다.

http://oreilly.com/catalog/javapt/chapter/ch04.html

마지막으로 내가 당신에게 (사용되지 않음) 개체 풀 패턴 또는 재사용 객체를 제안하자 참조하십시오.

결론, 없이, 일반적으로 말해서, 자바 객체 생성은 원시보다 느린 것

+1

이 점에있어서, 나는 문제가 포인트 3이라고 생각한다 : 건설 중 많은 일. 나는 '일반적으로 말하기, 자바는 실제로 객체를 만드는 것이 빠릅니다.'라는 마지막 문장을 바꿀뿐입니다. 몇 개월 전에 이것을 증명할 벤치 마크를 몇 개 발견했습니다. 다시 찾아야합니다. – ThanksForAllTheFish

+0

@Mardavi 벤치 마크를 검색 할 수 있다면 매우 흥미로운 것입니다. – venergiac

+1

시작 : http://onlinevillage.blogspot.ch/2011/03/is- javascript-is-cahtml보다 더 가깝습니다.이 또한 흥미 롭습니다 (결과는 표시하지 않지만 Java 성능 모니터링에 대해 자세히 설명합니다) : http://www.ibm.com/developerworks/library/j-5things8/ – ThanksForAllTheFish

2

단순히 75,000 개의 개체를 생성하는 데는 5 초가 걸리지 않습니다. 생성자가 수행중인 작업을 살펴보십시오. 오브젝트를 만드는 것 외에이 시간 동안 무엇을하고 있습니까? 지연이 발생하는 위치를 찾아 내기 위해 코드 타이밍을 시도 했습니까?

+0

OK, true 또는 프로파일 러 사용 (+1) – venergiac

+0

질문에서 말한대로 나는 내 엔진에서 실수를 발견했습니다. – th3falc0n

0

객체를 느리게하지, 그들은 또한 훨씬 더 많은 메모리를 소모합니다 - 그래서 당신이 그들에 배 밖으로가는 가능합니다. 더 자세한 내용을 보지 않고 말하기는 어렵습니다.

75000 개체하지만 작성하는 데 시간이 오래 걸릴하지 않습니다,이 시도 : 초 미만 촬영

List<Integer> numbers = new ArrayList<Integer>(); 
    for(int i = 0;i<75000;i++){ 
     numbers.add(i); // Note this will autobox creating an Integer object after the first 128 
    } 
    System.out.println(numbers.size()); 
} 

http://www.tryjava8.com/app/snippets/52d070b1e4b004716da5cb4f

총 시간. 내가 7,500,000에 번호를 넣을 때

는 마침내 자바에 두 번째 ...

+0

흥미로운 웹 사이트 주셔서 감사합니다.하지만 저는 방금 서버를 추락 시켰습니다. – th3falc0n

1

새로운 연산자는 매우 빠른 예를 들어, 새로운 운영자가 보통 (자동 메모리 관리가없는 언어의 일반적인 방법과 비교했다 시스템 호출이 필요 없기 때문에 C에서 malloc 명령보다 빠릅니다.

새 연산자는 여전히 병목 일 수 있지만 확실히 문제는 아닙니다. 75K 오브젝트를 생성하는 것은 5 초보다 빠릅니다.

0

물론 그렇지 않습니다. 다음 코드는 1,000 만 개의 객체를 할당하고 배열에 저장합니다. 내 5 년 된 노트북에서 1.4 초 만에 완료됩니다.

public class Test { 
    public static void main(String[] args) { 
     Object[] o = new Object[10_000_000]; 
     long start = System.nanoTime(); 
     for (int i = 0; i < o.length; i++) { 
      o[i] = new Object(); 
     } 
     long end = System.nanoTime(); 
     System.out.println(Arrays.hashCode(o)); 
     System.out.println(new BigDecimal(end - start).movePointLeft(9)); 
    } 
} 

... 그리고 그게 타이머를 시작하기 전에 테스트중인 코드의 시간 컴파일 그냥 실행되지 않는다는 점에서이 벤치 마크는 매우 순진 경우에도입니다.

관련 문제