2013-01-12 1 views
0

내 코드를 미세 조정하는 방법에 대한 여러 기사를 읽은 후에 우리는 개체와 변수를 선언하는 방식이 응용 프로그램 성능에 과감하게 영향을 미칠 수 있다는 것을 알게되었습니다. 시간 제한이 이제 Android 플랫폼의 일부 측면에서 없어서는 안될 요소이므로 (예 : 일부 작업의 경우 5 초 이내에 결과를 제공해야 함) 이는 점점 더 중요합니다.더 나은 성능 및 리소스 활용을 위해 사용할 구문

지금, 나는이 (완벽하게 기능) 내 조각 클래스 중 하나에 다음 코드를 발견 배수 제한하는 장치의 기여 요인의 일부

Activity myA = getActivity(); 
if(myA instanceof MainActivity) { 
((MainActivity) myA).doNext(); 
} 

아는 생성/파괴와 능숙 할당을 객체입니다 배터리를 사용하기 위해 코드를 다시 작성해야한다는 것을 염두에 두었습니다.

if(getActivity() instanceof MainActivity) { 
((MainActivity) getActivity()).doNext(); 
} 

기능면에서 두 코드 모두 동일한 결과를 제공합니다. 그러나 가장 적합한 방법은 무엇입니까? 찬성과 반대 의견을 모두 접근하고 성능을 평가할 적절한 방법을 찾을 수 없기 때문에 어떤 카운터 (메모리 사용, 기능 속도, CPU주기 사용 등)가 명확하지 않기 때문에 묻습니다.) 평가가 수행되어야합니다.

미리 제출해 주셔서 감사합니다.

+1

개체 생성/제거는 장치에서 초당 수천 번 발생합니다. 이 수준에서 최적화 할 가치가 있다고 확신합니까? –

+0

필자의 예는 매우 기본적인 것이므로이 특정 코드의 최적화에 많은 시간을 투자하지 않을 것입니다. 이러한 유형의 지정 및/또는 오브젝트 구성을 너무 자주하고 나서 결국 전체적인 성능에 영향을 미칠 수 있으므로 글로벌 관점에서 볼 때 더 많은 관심을 갖고 있습니다. 성능 측면에서 속도는 물론 외부 리소스 (배터리 등)에 대한 영향도 고려합니다. –

+0

@DominicHarvey 글로벌 관점에서 볼 때 프로파일 러는 실제로 말해 줄 수있는 유일한 도구이기 때문에 절대적으로 프로파일 러를 사용해야합니다 세계적인 관점에 관한 것. – millimoose

답변

4

성능 병목 현상이 무엇인지 추측하는 것은 매우 일반적인 시간 낭비입니다. 추측하는 대신 전체 프로그램에 어떤 변화가 있는지 측정해야합니다. 생성/파괴 개체를

아는 것은 중요하지 않습니다 몇 객체를 생성 요인

중 하나입니다. 너무 많은 객체 문제를 만듭니다. 얼마가 너무 많은지 그리고 가장 많이 생성되는 객체는 프로파일 러를 사용하여 결정해야하는 것입니다.

기능면에서 볼 때 두 코드 모두 동일한 결과를 제공합니다. 그러나 가장 적합한 방법은 무엇입니까?

가장 단순하다고 느끼는 것이 무엇이든간에. 나는 doNext 메서드를 getActivity()이 반환하는 클래스에 추가하는 것이 가장 좋을 것이므로 다음을 명료하게 작성한다고 생각합니다.

getActivity().doNext(); 

나는 성능

사용에게 CPU 및 메모리 프로파일을 평가하거나 시스템의 다른 구성 요소에 대한 성능 테스트를 작성하는 적절한 방법을 찾을 수 없습니다입니다.

카운터 (메모리 사용, 기능 속도, 사용 된 CPU주기 등)는 평가가 수행되어야합니다.

프로파일 러를 사용할 수 없으면 경과 시간이 짧아집니다. 즉 System.nanoTime(). 이것은 보통 필요한 것입니다.

+0

많은 분들께 감사드립니다. 추천 할 프로필이 있습니까? Window 7에서 Eclips를 사용하고 있습니다. –

+0

VisualVM은 무료이며 JDK와 함께 제공됩니다. 나는 당신의 평상시의 문제를 해결할만큼 충분히 긴 eval 라이센스 (2 주 무료)를 얻을 수있는 YourKit을 사용합니다. ;) –

+0

나는 15 년 넘게 성능 튜닝 시스템을 사용해 왔지만 나는 결코 생각하지 못했던 단순한 것이 얼마나 자주 성능에 영향을 미치는지 얼마나 놀랍다.헤지 펀드 (hedge fund)의 고위 개발자들과 인터뷰를 한 결과 시스템 전체를 고려하지 않았기 때문에 몇 달 동안 시스템을 튜닝하는 데 더 많은 시간이 걸렸습니다. –

0

getActiviy이 새 개체를 만들지 않으면 대신 일부 조건에 따라 만들어진 개체를 반환하며 계산이 많이 필요하지 않으므로 두 번째 방법이 더 좋습니다. 그러나 getActivity을 호출 할 때마다 새 객체를 만들거나 getActivity이 계산 집중적 인 경우 먼저 접근하는 것이 좋습니다.

3

선언/할당은 Java에서 객체 생성이 아닙니다. 그것은 단지 스택에 참조를 넣는다. 첫 번째 것은 더 명확하고 가능하면 빠릅니다 (getActivity은 한 번만 호출 됨).

1

getActivity()의 기능에 따라 다릅니다. 두 코드 세그먼트의 차이점은 두 번째 코드가 두 번 째 함수를 호출한다는 것입니다. 함수 호출 자체는 매우 빠르지 만 함수가 수행하는 작업이 빠르지 않을 수 있습니다.

이 기능이 무엇인지 잘 모르는 경우 두 번째 것이 더 읽기 쉽지만 첫 번째 기능 만 사용할 수 있습니다.

0

getActivity()가 호출 할 때마다 다른 객체를 반환하는 경우 두 번째 버전은 이고, 올바르지 않은 경우이고 두 번째 버전은 중복됩니다. 두 번째 버전을 선호하는 이유도 아니며, 두 번째 버전을 선호하는 다른 이유도 없습니다. Pater Lawrey가 말한 것처럼, 성능 문제가 어디 있는지 추측하려고 시간을 낭비하지 마십시오. 법안.

관련 문제