2009-10-11 5 views
1

getter/setters가 50 개인 객체가 있고 그 중 10 개가 새 인터페이스에서 정의되고 해당 객체를 해당 인터페이스 중 하나로 입력하면 성능이 향상됩니까?인터페이스에 입력하면 성능이 향상됩니까?

방법/변수 조회가 어떻게 작동하는지 잘 모르겠지만, 적은 수의 메소드가있는 객체에 객체를 입력하면 그 메소드를 실행하는 것이 더 빠를 것 같습니다.

나는 Actionscript/Java를 요구하고 있지만 이것은 내가 추측하는 모든 언어에 적용됩니다.

5 개의 인터페이스 (IResizable, IScalable, IMovable, IMeasurable, IDrawable)를 구현 한 DisplayObject 개체가 있고 x 및 y 접근자를 액세스 할 수 있도록 IResizable로 입력 한 경우 최적화가 수행됩니까?

그렇지 않으면 인터페이스를 사용하는 것이 코드를 더 읽기 쉽게 만들고 정의 된 패턴을 고수하는 것입니다.

+5

답변이 있다면 극히 * 언어/플랫폼에 따라 다릅니다. 쉬운 대답은 아닙니다. – skaffman

+0

그게 전부입니다. 나는 그 물건을 알고 싶습니다. –

+0

기능이 있습니다. 인스턴스 유형의 변수를 선언해도 가리키는 실제 객체에 대해서는 아무 것도 변경되지 않습니다. – Dolphin

답변

4

코드가 기본적으로 실행 중이면 (jitted/compiled) 인터페이스 메서드는 가상 호출에 해당합니다. 클래스에는 각 인터페이스 메소드의 함수 주소를 나열하는 v 테이블이 있습니다. 이는 간접 참조를 조금 추가하지만 일반적으로 매우 빠릅니다. 이는 가상 메소드가 작동하는 것과 같은 방식입니다. 보통 실행 속도가 같거나 매우 가깝습니다.

비 가상 메서드 (많은 언어의 경우 가상 메서드가 명시 적으로 그렇게 선언되어야 함)를 사용하면 주소가 하드 코딩되고 약간 빠릅니다.

"메서드 검색 중"(컴파일 타임에 정렬 됨)이 없으므로 메서드의 수가 부적절합니다.

물론 이것은 일반화 된 대답이며 해석 된 코드에는 전혀 적용되지 않습니다.

1

은 최적화 되었습니까?

인터페이스로 캐스트하면 해당 메소드에서 지원하는 메소드 수가 줄어 듭니다. 메소드 호출에 드는 비용이 메소드의 수에 비례한다면 더 빠를 것입니다. 그러나 그 언어가 사실 인 곳은 모르겠다. 그래서 내 대답은 "나는 생각하지 않는다"입니다.

그렇지 않으면 인터페이스를 사용하는 것이 코드를 읽기 쉽도록 만들고 지정된 패턴을 고수하는지 확인하는 것입니다. 다음과 같이 인터페이스의 주된 이유는 IMO입니다

: 예를 들어 나는이 같은 DeviceManager 클래스를 구현하는 경우 ...

interface IDevice 
{ 
    string name { get; } 
    string description { get; } 
    bool start(); 
    bool stop(); 
} 

class DeviceManager 
{ 
    void install(IDevice device) { ... } 
    void displayUI(Windows window) { ... } 
} 

... 그때는 모든 종류의를 관리 GUI를 쓸 수 있습니다 장치 : 해당 클래스가 IDevice 인터페이스를 구현하는 한, DeviceManager을 작성했을 때 클래스가 아직 작성되지 않은 장치 인스턴스도 관리 할 수 ​​있습니다.

0

자바의 경우, 객체의 메소드 호출은 런타임 중에 결정되므로 실제로는 문제가되지 않습니다. 인터페이스는 읽기 전용이 아니라 객체 계층 구조와 다형성을 확인하는 데 사용됩니다.

3

Java 프로그램을 한 번 벤치마킹 한 결과 인터페이스 메소드 호출이 클래스 메소드 호출보다 두 배 느리다는 것을 알았습니다.따라서 인터페이스 호출을 위해 약간의 여분의 오버 헤드 (간접 포인터 역 참조)가 있습니다.

하지만 실행 시간 (예 : 실시간 오디오 또는 그래픽 처리)이 매우 힘들지 않는 한 추가 오버 헤드가 걱정 될 만한지 잘 모르겠습니다.

0

두 가지 방법을 모두 사용하는 환경에서 테스트 프로그램을 작성하십시오. 각 방법을 1000000 번 호출하고 더 빠른 측정하십시오.

그런 다음, 각 기능에 약간의 작업을 추가하십시오 (알다시피, 제곱근이나 다른 것을하십시오). 이전 테스트의 노이즈와의 관련성을 지켜보십시오

관련 문제