“성능이 필요한 곳에 열거하지 마십시오”가 Android의 성능 팁에서 제거 된 이유는 무엇입니까?


175

공식 개발자 설명서 에서 "Ints 만 필요한 곳에 열거하지 마십시오"절이 제거되었습니다 . ( 이전 섹션 내용에 대해 Android에서 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까? )

왜? 팁이 더 이상 사용되지 않는 Android VM이 변경 되었습니까?


2
참고로 Shrubbery 예제 의 디 컴파일 된 바이트 코드는 다음과 같습니다. https://gist.github.com/847418
Josh Lee

15
2014 년 3 월, 다음 페이지는 여전히 사용하여 열거 형에 대한 조언을 포함 developer.android.com/training/articles/memory.html#Overhead
타히르 악 타르

2
1 년 후 @TahirAkhtar가 말했듯이 공식 Android 교육에서는 여전히 "Android에서 열거 형을 사용하지 않아야합니다."라고 말합니다.
LarsH

1
enum을 피하기위한 권장 사항에 주목하는 것은 Android 개발자 인 medium.com/google-developers/의 2015 년 기사에 있습니다. 또한 : "Android Studio 및 Gradle 1.3 이상에서 지원되는 @IntDef 주석 사용, int 변수를 사용할 때의 크기와 성능 이점을 유지하면서 코드 빌드 타임 유형 안전 (보풀이 오류가 활성화 된 경우)을 제공합니다. "
tonylo

4
2018 년 4 월 현재 다음 페이지에는 열거 형 사용에 대한 조언이 더 이상 포함되어 있지 않습니다. developer.android.com/topic/performance/memory#Overhead
Robin Davies

답변:


157

그 문서의 원본 버전은 여러 가지 편견 일뿐입니다. 실제 벤치 마크로 백업 된 사실 만 포함하도록 재 작성되었으며 VM이 업데이트 될 때 업데이트됩니다. http://code.google.com/p/dalvik/ 에서 다양한 벤치 마크와 핵심 라이브러리를 최적화하는 데 사용하는 일부 벤치 마크를 찾을 수 있습니다 .


35
SO 프로파일에 자격 증명을 나열하면 도움이됩니다. 주위를 파고 들었다. 하지만 이제 VM 팀에서 일하는 것처럼 보이므로 답변을 공식 답변으로 수락하겠습니다. :)
Thierry-Dimitri Roy

25
열거 형 클래스를 추가한다는 것은 물론 앱에 추가 클래스가 포함되어 있기 때문에 무료 가 아니지만 개발자가 유용한 경우에만 열거 형을 추가한다고 가정해야합니다. 내가 열거 형에서 본 유일한 나쁜 사용법은 비트 마스크와 같은 정수를 정말로 원했던 일부 조화 코드에서 있었고 "enum"은 합리적인 의미에서 열거 형이 아니 었습니다. "ordinal ()"을 많이 호출하면 악취가 발생하여 열거 형을 원하지 않습니다. 그러나 이것은 Android 전용 팁이 아니며 어쨌든 디자인 오류는 거의 없습니다.
Elliott Hughes

17
이 문서 는 @ Thierry-DimitriRoy뿐만 아니라 구식입니까? 특히 Android에서는 열거 형을 사용하지 않아야합니다.
Jacob Tabak

3
FWIW, Proguard는 기본적으로 열거 형을 정수로 변환 합니다.
Nacho Coloma

11
당신이 준 링크가 죽었습니다.
Terry

26

추측:

  • Hummingbird 및 Snapdragon과 같은 Gigahertz CPU가 이제 일반적이며 Dalvik VM을 원래 제약했던 작은 코드의 작은 메모리 요구 사항은 더 이상 사실이 아닙니다.
  • 모든 운송 장치는 JIT를 사용합니다 (2.2 이상). 열거 형의 클래스 이니셜 라이저가 더 빠르게 실행되고 값이 JIT- 시간 상수로 처리 될 수 있으며 JIT는 열거 형 클래스를 능률화하는 데 특별한 지원을 제공 할 수 있습니다.
  • 실제로 성능에 민감한 코드는 Android 1.5가 출시되었을 때 여전히 새롭고 닦이지 않은 NDK를 사용합니다. 2.3의 NDK는 기본 활동을 지원하므로 거의 관리되지 않는 게임을 할 수 있습니다.

따라서 GUI 응용 프로그램의 비교적 일반적인 요구 사항의 경우 열거 형의 개발 시간 이점이 추가 런타임 비용보다 훨씬 큽니다.


23

Elliott Hughes는 자신의 블로그 ( http://elliotth.blogspot.com/2010/09/java-benchmarks.html) 에서 문서 재 작성에 대한 자세한 내용을 제공합니다 .

이 포스트의 후반부에서는 퍼포먼스 문서에 대한 모든 클레임이 이제 벤치 마크로 백업된다고 설명합니다. 이전 버전의 문서에는 "너무 비싸서 열거 형을 피하십시오."와 같이 확인되지 않은 주장이 포함되어있었습니다.


이 링크로 엘리엇의 인정 된 답변을 보충하고 싶었습니다.
jkooker

12

Elliot Hugues의 2011 년 답변에 따르면 열거를 피하는 원래의 이유는 "프로세스 성능"과 같이 성능상의 이유 때문이었습니다. 이 이유는 사실상 뒷받침되지 않았기 때문에 공식 문서에서 제거되었습니다.

열거 형은 정수를 사용하는 것보다 메모리에 더 많은 데이터를 추가하기 때문에 나중에 추가되었습니다.


2
또한 Google 직원은 IntDef주석을 도입 하여 Android Studio 오류 및 경고와 함께 int 상수를 안전하게 사용할 수 있습니다. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

9

TLDR : Dalvik은 메모리 할당에 좋지 않았 Enum으며보다 많은 메모리를 사용합니다 int. Android Lollipop은 Dalvik을 ART로 대체했지만 동일한 제한이 없습니다. 따라서이 권장 사항은 더 이상 관련이 없습니다.

긴 대답 :

와! 8 년, 5 답변 및 많은 의견 후에도 실제 이유는 아직 다루지 않았습니다.

롤리팝 이전 안드로이드 시대에는 Dalvik이 사용 된 프로세스 VM이었습니다. 이 기간 동안 응용 프로그램에서 사용할 수있는 메모리 양이 적었 기 때문에 Dalvik은 많은 메모리 제약 조건을 가지고있었습니다. 메모리 할당을 위해 Dalvik은 힙을 걸어 공간을 찾아야했습니다. 힙도 시간이 지남에 따라 조각화됩니다. Dalvik은 조각 모음을 수행 할 수 없으므로 시간이 지남에 따라 할당되어 결국 공간이 부족합니다.

정수만 필요한 열거 형 피하기

이 때문에 달빅 일에서 오는 Enum보다 훨씬 더 큰 int메모리 할당은 매우 비쌌다.

오늘날 Dalvik은 ART로 대체되었습니다. ART는 KitKat에서 출시되었으며 Lollipop 이후 기본값입니다.

ART는 메모리를 최적화하지 않고 성능을 최적화하기 위해 처음부터 만들어졌습니다. 또한 할당 및 수집에 최적화되어 있습니다. 그 이유는 큰 객체를 위해 메모리가 별도로 설정되어 있기 때문입니다. ART는 모든 것을 동일한 힙에 넣은 다음 작은 오브젝트 가운데 큰 오브젝트를위한 공간을 찾아야하는 대신 모든 큰 오브젝트와 비트 맵을 별도의 힙에 넣습니다. 그런 다음 작은 물체는 별도의 힙에 들어갑니다. 또한 조각 모음이 가능합니다.

ART 후에 EnumAndroid 를 사용하는 경우 신경 쓰지 않으므로 권장 사항이 사라졌습니다.

이것은 구글의 Chet Haase에서 온 것입니다. Google I / O 대화를 찾아 전체 동영상을 시청하는 것이 좋습니다. 유용한 정보와 Android에 대한 통찰력이 많이 포함되어 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.