2009-09-08 3 views
1

Java 프로그래밍 언어에서 가장 비용이 많이 드는 것은 무엇입니까 (바이트 코드 및 CPU 사이클 측면에서)?자바, 가장 비싼 계산서?

+2

너무 모호합니다. 찾고있는 답변의 유형에 대해 명확하게 설명하십시오. –

+1

진술로 무엇을 정의합니까? 함수 호출? 나는 수면을 할 수 있었고 (999999999999999999) 그것은 매우 비쌀 것입니다. –

답변

8

모든 언어에서 다양한 구문을 사용하여 여러 번 실행하고 소요 시간을 확인할 수 있습니다. 네 질문이 그보다 더 지능적이라고 가정하고있어. 예를 들어 in this scenario과 같이 여러 튜닝 단계가 수행되었으며 각 단계마다 다른 문제가 주요 문제였습니다.

  • 첫 번째 단계 : 주요 시간 결정자는 반복기를 증가시키는 것과 같습니다. (정수 인덱스를 사용하십시오.)

  • 문제를 해결 한 후에는 링크 된 목록을 한 번에 하나씩 작성해야합니다. (모두 고치십시오.) 한 번에 모두 빌드하십시오.

  • 재 설계 후 중요한 문제는 객체에 대한 기억 장치 할당 및 해제입니다. (고침? 사용한 물건 재사용)

각 단계마다 약간의 문제가 있습니다. 그것을 고치고 (좋은 스피드 업을 얻은 후에), 어떤 다른 문제는 새로운 가장 큰 문제입니다. 그것을 고친 후 ...(가장 큰 문제가 무엇인지 알 수있을 때까지 계속하지만 문제를 해결할 수는 없습니다.)

"어떤 문장이 가장 비쌉니다"와는 거의 관계가 없습니다. 성명서가 당신이 절대적으로해야 할 일을하고 있고, 더 나은 방법으로 그것을 할 수 없다면, 정의에 따르면 그것은 그 일을위한 최선의 진술입니다.

+1

자바에서 타이밍 물건은 특히 HotSpot 때문에 어렵습니다. 여러 번 실행하는 것만 큼 간단하지 않습니다. 누구든지 정확한 타이밍을 수행하는 방법에 관한 결정적인 문서를 작성했는지 궁금합니다. –

+2

@ 실 키 : 나는 방법이있을 것이라고 확신하지만, 나에게는 순수하게 학문적입니다. 나는 거의 그렇게하지 않는다. 필자에게 성능 튜닝은 타이밍 작업과 거의 관련이 없습니다. 프로그램 상태의 무작위 샘플을 가져 와서 프로그램이 실제로 무엇을하는지 보면서 "이것이 정말로 필요합니다"라고 묻는 것과 관련이 있습니다. –

2

아마도 CPU 사이클의 경우 예외 처리.

+5

실제로 예외 생성은 아마도 더 비쌉니다. –

1

나는 sleep()이 가장 비용이 많이 든다. ;)

질문에 대한 자세한 내용이 필요합니다. 언제든지 쓸 수 있습니다.

while(true) {} 

그리고 CPU 사이클이 끝없이 레코딩됩니다. 어떤 종류의 진술을하고 있습니까?

IO를 포함하거나 System.out에 대한 호출과 같이 코드를 직렬화하는 것을 포함합니다. CPU 사이클의 관점에서

+0

java 문에 의해 생성 된 바이트 코드를 비교하면 어떤 문이 더 많은 시간이 걸리거나 더 많은 바이트 코드가 생성됩니까? –

1

:

public class Zombie extends Thread { 
    public void run() { 
     while (true) 
     {(new Zombie()).start();} 
    } 

    public static void main(String args[]) { 
     (new Zombie()).start(); 
    } 
} 

Borrowed and adapted from here

, 틀림없이 정확히 하나의 문하지만.

5

쉬운 대답은 아닙니다. VM 및 기본 하드웨어에 따라 다릅니다. 사용중인 VM은 아마 바이트 코드를 기계어 코드로 컴파일하므로 질문 : 하드웨어에서 가장 비싼 어셈블리 호출은 무엇입니까?

전통적으로 최악은 계산 측면에서 나뉩니다. 그러나 계산은 싸다. 그리고 기억은 멀리있다. 따라서 현대 하드웨어에서 가장 비싼 호출은 캐시를 놓친 메모리 액세스입니다. 메인 메모리로 나가려면 500-1000 CPU주기가 소요됩니다.

그래서 같은 라인 : x는 캐시를 밀어 된 경우

 
    x++; 

이 ..., 사이클 수백 걸릴 수 있습니다. 가장 일반적인 예는 메모리에있는 링크 된 목록을 탐색하는 것입니다. 링크 된 목록이 드문 드문 시스템 메모리에 분산 할 수 있기 때문에

 
for (ListElement n = ...; n != null; n = n.next()) { 
    n.val++; 
} 

다음은 전화 n.next()는 500-1000주기마다 시간이 걸릴 수 있습니다.

1

OP, BCEL project을 보시고, Java ByteCode에 대한 자세한 내용을 알아 두셔야 할 것입니다.

관련 문제