안드로이드 앱이 해석되므로 iOS 앱이 안드로이드 앱보다 빠릅니까?


31

Android 앱은 컴파일되지 않고 해석됩니다. 런타임에 iOS 앱보다 속도가 느려 집니까?


14
그건 하지 안드로이드 앱은 때문에 좋은 질문 하지 않는 해석 의인으로, 올바른 대답은 실제로 지적한다.
Aaronaught

2
일반적으로 가장 좋은 답변이 아닌 승인 된 답변은 그다지 큰 문제가되지 않습니다. 목표는 질문 한 사람을 돕는 것입니다 ( 메타 게시물 참조 ). 그러나 이것은 매우 극단적 인 경우입니다. @ArmonSafai 정답으로 선택한 답변은 잘못된 정보로 가득 차 있으며 편집으로 회복 할 수있는 시점을 지났습니다. 다른 답변을 선택하십시오.
Selali Adobor

요즘에는 IBM을 포함한 일부 주요 기업이 Java로 주요 애플리케이션을 작성하고 있습니다. 최신 Java VM의 표준 부분 인 JIT (Just-In-Time) 컴파일러를 고려할 때 성능은 실제로 다른 고급 언어와 비교할 수 있습니다. 자바는 오랫동안 "해석 된 언어"가 아니었다.
keshlam

JIT 컴파일러는 JVM 개념과 전혀 관련이 없습니다. JIT 컴파일러를 사용하지 않는 상업용 JVM도 있습니다. IBM JVM의 일부 변형은 기본적으로 JIT를 사용하지 않고 대신 AOT 컴파일을 사용합니다. 또한 "요즘 자바의 주요 응용 프로그램"은 아마도 10 년 반 전에 조금 더 적절했을 것입니다 (IBM은 1997 년 이전에 Java에 추가했습니다)
Selali Adobor

문제는 다소 오해의 소지가 있습니다. "기본"iOS 앱은 Objective-C (또는 Swift)로 작성되고 컴파일되는 반면 "표준"Android 앱은 Java로 작성되고 바이트 코드로 컴파일됩니다. @DanHulme의 답변을 참조하십시오. 그러나 PhoneGap / Cordova를 사용하여 HTML 및 JavaScript로 플랫폼에 대한 앱을 작성할 수 있습니다. HTML 앱은 일반적으로 동일한 플랫폼에서 기본 앱보다 느리게 실행되는 것으로 인식됩니다. 따라서 "다른"플랫폼과 유사한 앱이 느리게 보일 경우 다른 기술을 사용하여 만들어 졌기 때문일 수 있습니다.
David

답변:


85

Java는 Android에서 해석되지 않습니다. Android 앱은 개발자 가 바이트 코드 로 컴파일합니다 . 바이트 코드는 프로그램의 간단한 표현입니다. 프로그래머가 작성한 소스 코드보다 작지만 CPU에서 직접 실행할 수는 없습니다. 이 단계에서 데드 코드 제거와 같은 일부 최적화를 수행 할 수 있습니다.

장치에 앱을로드하면 Dalvik JVM은 실행하려고하는 것처럼 바이트 코드를 기본 실행 코드로 컴파일합니다. 이것은 적시 컴파일입니다. 프로그램 컴파일을 기다리는 동안 잠시 느려지지만 코드가 원시 실행 코드로 컴파일 되었기 때문에 성능 오버 헤드가 없습니다.

개발자 컴퓨터에서 미리 컴파일하는 대신 이런 식으로 수행하면 몇 가지 성능 이점이 있습니다. 휴대 전화의 특정 CPU에 맞게 앱을 컴파일하여 하드웨어 기능을 활용하고 성능 특성을 활용할 수 있습니다. 예를 들어, CPU가 지원하는 경우 하드웨어 부동 소수점 연산을 사용할 수 있습니다. 또한, 영리한 JIT 컴파일러 (Dalvik은 이처럼 영리하지 않습니다)는 프로그램 실행 방식을 모니터링하고 프로그램이 실제 사용되는 방식에 따라 최적화를 수행 할 수 있습니다. 환경, 휴대 전화에서 어떤 옵션이 켜지고 꺼 졌는지 확인한 후에 더 나은 분기 힌트를 사용하여 코드를 다시 컴파일 할 수 있습니다. 선행 컴파일러에는 사용할 정보가 없습니다.

Dalvik은 Dalvik 캐시 및 기타 기술을 사용하여 JIT 컴파일의 단점을 완화합니다. Android L 이상에 대한 새로운 JVM 인 ART는 JIT를 사전 컴파일러로 완전히 대체합니다 . 앱이 설치 될 때 바이트 코드를 기본 실행 코드로 컴파일하여 앱로드 지연없이 JIT의 장점을 최대한 활용할 수 있습니다.

Android 앱이 완전히 Java로 구성되지는 않습니다. 개발자는 NDK 가 앱의 성능에 중요한 부분, 특히 게임을 위해 C 또는 C ++로 앱의 일부 또는 전부를 작성 해야합니다 . 프로그래머는 OpenGL 및 Renderscript와 같은 특수 목적 인터페이스를 통해 GPU 및 SIMD 보조 프로세서와 같은 특수 하드웨어를 사용하여 일부 계산을 수행 할 수 있습니다.

따라서 실제로 귀하의 질문에 대한 간단한 답변은 없습니다. 선행 컴파일 대신 JIT를 사용하면 작업 속도가 빨라지고 작업 속도가 느려집니다. OS의 전체 성능 중 일부일뿐입니다.


1
훌륭한 설명을 위해 +1. 나는 실제로 이와 같은 대답을 기다리고있었습니다.
MANI

5
PC에서 지친 오래된 ".NET / Java vs. C ++ 성능"토론과 크게 다르지 않습니다. 사과와 오렌지입니다.
Aaronaught

1
@ArmonSafai 아주 그렇습니다.
Dan Hulme

2
@MTilsted : 그건 가지 사실 만은 그래서 당신은에 대한 가능성 만이 응용 프로그램을 실행하는 첫 번째 시간이 일어날 것이라고 말을하는지 거의 모두를 캐시합니다.
Aaronaught

1
여기서 중요한 문제는 Dalvik이 "정상"JVM 인 것입니다. ARM 프로세서의 특성과 HotSpot이 대상 (예 : IA32)을 대상으로하기 때문에 HotSpot과 같은 스택 기반의 레지스터와 달리 레지스터 기반 사이에서 Zygote를 사용하고 odex 파일의 개념 (예 : 전체 아이디어) Dalvik을 일반 JVM으로 취급하면 약간의 오해가 발생할 수 있습니다. 특히 HotSpot 구현에 대한 많은 세부 정보가 종종 JVM과 일반적으로 잘못 연관되어 있기 때문에 (JIT 컴파일러처럼)
Selali Adobor

2

이것은 광범위한 질문이므로 여기에 광범위한 답변이 있습니다.

"Android 앱이 해석되므로 iOS 앱이 Android 앱보다 빠릅니까?"

우선 iOS 앱은 안드로이드 앱보다 "빠르지"않습니다.

둘째로, "Android 앱은 해석됩니다." 이것은 "15 년 전"과 같이 컴퓨팅에 대해 말한 것입니다. 위의 논의에서 볼 수 있듯이 오늘날 상황은 훨씬 더 복잡합니다. 완전히 새로운 기술이 등장했습니다. "컴파일이 해석보다 빠릅니다!"라는 개념 20 년 전에 기계 코드와 펄을 비교하는 것과 관련이있었습니다. 문제는 오늘날 "iOS V Android"에 실제로 명확하게 적용될 수 없습니다.

셋째, 모바일 프로그래밍에는 이와 같은 고려 사항을 완전히 뒤엎는 다른 문제가 있습니다. 지상의 한 가지 예를 들어, 모바일 프로그래머는 이미지의 큰 스크롤 목록, 게으른 로딩 및 유사한 문제를 처리하는 데 어려움을 겪습니다. 두 OS와 다양한 인기 라이브러리가 이러한 중요한 문제를 처리하는 방법은 종종 다른 문제를 휩쓸고 있습니다.

넷째, 모바일에서 한 가지 더 큰 문제는 그래픽 칩셋의 문제와 소프트웨어, OpenGL 등과의 다양한 복잡한 관계입니다. 예를 들어, Apple은 이러한 문제와 관련하여 "금속"을 계산하는 시스템을 출시하고 있으며, Android는이 분야에서 자체 "사물"을 제공합니다. 그래픽 파이프 라인과 관련된 이러한 문제는 앱이 사용자의 "느낌"을 느끼는 데 매우 중요합니다.

귀하의 질문에 대한 가장 짧은 대답은 "컴파일 된 V. 해석 됨"입니다. 기본적으로 오래된 토론 포인트입니다.

(또한 iPhone보다 Note3이 더 느리다는 것을 알지 못합니다. 또한 일부는 순수한 인공물입니다. 저렴한 안드로이드 폰이 있습니다. 저렴한 성능의 iPhone이 없기 때문에 일부 사람들이 잘못했을 수 있습니다. 이것으로부터 아이디어.)


-3

해석 된 앱이 항상 느리다는 의미는 아닙니다. 때로는 컴파일 된 것보다 더 강력하고 역동적입니다. 컴파일 된 앱의 모든 코드가 한 번 컴파일되고 출력이 라이브러리 또는 실행 파일 형식으로 유지되는 동안 interprated language로 한 번 실행 순서를 임의로 변경할 수 있습니다. 그래서 말할 수 있습니다. 개발자마다 개발자와 프로그래밍 방법에 달려 있습니다.

그러나 Java (Android의 프로그래밍 언어)는 해석되지 않지만 JIT 컴파일됩니다. 즉, Android 프로그램은 실행하기 직전에 컴파일되어 iOS의 Objective C와 비슷한 성능을 제공합니다.

최근에는 Android의 ART 프레임 워크가 앱을 사전 컴파일하므로 iOS 앱과 동일한 방식으로 실행됩니다. 다시 말해, 다음 버전의 Android는 아마도 iOS만큼 빠를 것입니다.

최신 정보

프로그래밍 언어는 일반적으로 컴파일 또는 해석이라는 두 가지 범주 중 하나에 속합니다. 컴파일 된 언어를 사용하면 사용자가 입력 한 코드가 실행 파일로 저장되기 전에 기계 별 명령 세트로 축소됩니다. 해석 된 언어를 사용하면 코드는 입력 한 것과 같은 형식으로 저장됩니다. 해석 된 프로그램은 런타임에 기계 명령어로 줄여야하기 때문에 컴파일 된 프로그램은 일반적으로 해석 된 프로그램보다 빠르게 실행됩니다. 그러나 해석 된 언어를 사용하면 컴파일 된 언어로 수행 할 수없는 작업을 수행 할 수 있습니다. 예를 들어, 해석 된 프로그램은 런타임시 기능을 추가하거나 변경하여 자신을 수정할 수 있습니다. 작은 섹션을 테스트 할 때마다 응용 프로그램을 다시 컴파일 할 필요가 없기 때문에 일반적으로 해석 환경에서 응용 프로그램을 개발하는 것이 더 쉽습니다.


1
? 무슨 뜻 이죠 "한 번 무작위 또한 그들은 심지어 약간 느린 단지, 그 theyre를 천천히 말을 메신저하지 실행의 순서를 변경 어떻게 그들이 더 강력하고 역동적 수 있습니까?.
ARMON Safai

3
이것은 사실이 아닙니다. APK 파일을 빌드하고 테스트 장치에 배포해야하므로 다시 컴파일하지 않아도 유리하다는 장점이 있습니다. 구글은 자바를 사용하지 않기로 결정했다. 구글은 이미 자바를 구매하기 전에 자바 기반이었다. APK 파일에는 "[프로그래머]가 입력 한 것과 같은 형식으로 된"코드가 없습니다.
Dan Hulme

1
Microsoft .NET은 IL 코드로 컴파일되며 Java는 바이트 코드로 컴파일되는 것처럼 해석됩니다.
Esben Skov Pedersen

12
이 답변의 많은 정보는 실제로 관련이 없거나 기술적으로 정확하지 않습니다. 솔직히 말해서이 답변은 기술적 정확성을 위해 완전히 개정되어야합니다.
Aza

2
비정상적인 JVM 구현을 다루지 않는 한 Java는 일반적으로 해석되는 언어아닙니다 . JIT 컴파일은 인터프리터와 같은 것이 아니기 때문에이 답변의 대부분은 JIT를 사용하기 때문에 Android 성능과 관련하여 정직하지 않습니다.
eldarerathis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.