Os aplicativos iOS são mais rápidos que os aplicativos Android, pois os aplicativos Android são interpretados?

31

Os aplicativos Android são interpretados em vez de compilados. Isso os torna mais lentos que os aplicativos iOS em tempo de execução?

Armon Safai
fonte
14
É não uma boa pergunta, porque aplicativos Android não são interpretados, assim como a correta resposta aponta na verdade.
Aaronaught
2
Normalmente, a resposta aceita que não é a melhor resposta não é um problema muito grande, pois o objetivo é ajudar quem fez a pergunta (consulte esta meta post). Mas este é um caso bastante extremo @ArmonSafai A resposta que você selecionou como correta está cheia de informações erradas e já passou do ponto de ser recuperável com edições. Por favor, considere selecionar outra resposta.
Selali Adobor 21/09
Observe que algumas grandes empresas - incluindo a IBM - estão escrevendo grandes aplicativos em Java atualmente. Dado um compilador Just-In-Time (JIT), que é parte padrão de uma Java VM moderna, o desempenho é realmente comparável a qualquer outra linguagem de alto nível. Java não é apenas "uma linguagem interpretada" há muitos anos.
precisa saber é o seguinte
Os compiladores JIT não estão vinculados ao conceito de JVM. Existem JVMs que não usam compiladores JIT, mesmo comerciais. Algumas variações da JVM da IBM não ativam o JIT por padrão, substituindo a compilação AOT. Além disso, uma pequena nota, "grandes aplicações em Java nos dias de hoje" foi provavelmente uma mais década um apt bit e meio atrás (IBM estava adicionando ao Java antes de 1997)
Selali Adobor
A questão é um pouco enganadora. Um aplicativo iOS "nativo" é escrito em Objective-C (ou Swift) e compilado, enquanto um aplicativo Android "padrão" é gravado em Java e compilado no bytecode. Veja a resposta de @ DanHulme. Mas é possível escrever aplicativos para qualquer plataforma em HTML e JavaScript usando, por exemplo, PhoneGap / Cordova. Normalmente, um aplicativo HTML é executado mais lentamente do que um aplicativo nativo na mesma plataforma. Portanto, se um aplicativo semelhante para a "outra" plataforma parecer mais lento, talvez seja porque ele foi criado usando uma tecnologia diferente.
David

Respostas:

85

Java não é interpretado no Android. Os aplicativos Android são compilados para o bytecode pelo desenvolvedor. Bytecode é uma representação compacta do programa: menor que o código fonte escrito pelo programador, mas ainda não é diretamente executável pela CPU. Algumas otimizações, como remoção de código morto, podem ser feitas neste estágio.

Quando você carrega o aplicativo em um dispositivo, a Dalvik JVM compila o bytecode no código executável nativo, assim que está prestes a ser executado. Esta é uma compilação just-in-time . Isso causa uma breve desaceleração enquanto o programa aguarda a compilação, mas depois disso não há sobrecarga de desempenho, porque o código foi compilado no código executável nativo.

Existem algumas vantagens de desempenho em fazê-lo dessa maneira, em vez de compilar antecipadamente no computador do desenvolvedor. O aplicativo pode ser compilado para a CPU específica do telefone, aproveitando seus recursos de hardware e usando suas características de desempenho. Por exemplo, ele pode usar operações de ponto flutuante de hardware se a CPU suportar. Além disso, um compilador JIT inteligente (reconhecidamente, Dalvik não é tão inteligente assim) pode monitorar a maneira como o programa é executado e executar otimizações com base na maneira como o programa é usado em uso real. Ele pode recompilar o código com dicas de ramificação melhores depois de ver quais opções estão ativadas e desativadas no ambiente, no telefone. Um compilador inicial não tem essas informações para usar.

O Dalvik usa o cache do Dalvik e outras técnicas para mitigar os inconvenientes da compilação do JIT. A nova JVM para Android L e posterior, ART, substitui o JIT inteiramente por um compilador antecipado . Isso compila o bytecode para o código executável nativo quando o aplicativo é instalado, para obter a maioria das vantagens do JIT sem demora no carregamento do aplicativo.

Não esqueça que os aplicativos Android não consistem inteiramente em Java. Os desenvolvedores têm o NDK para escrever todos ou parte de seus aplicativos em C ou C ++, para partes críticas do desempenho do aplicativo, especialmente para jogos. Interfaces para fins especiais, como OpenGL e Renderscript, permitem que os programadores tirem proveito de hardware especial, como o coprocessador GPU e SIMD, para alguns tipos de computação.

Então, realmente, não há uma resposta simples para sua pergunta. Usar o JIT em vez da compilação inicial torna algumas coisas mais rápidas, outras mais lentas. É apenas uma parte do desempenho geral do sistema operacional.

Dan Hulme
fonte
1
+1 para uma ótima explicação. Na verdade, eu estava esperando por uma resposta como essa.
MANI
5
Não é muito diferente do velho e cansado debate ".NET / Java vs. C ++ performance" no PC, realmente. São maçãs e laranjas.
Aaronaught
1
@ArmonSafai Bastante.
Dan Hulme
2
@MTilsted: Isso é meio verdade, mas armazena em cache quase tudo, então o que você está falando provavelmente acontecerá apenas na primeira vez em que você executar um aplicativo.
Aaronaught
1
O principal problema aqui é que Dalvik está sendo considerado como uma JVM "normal". Entre ser baseado em registro, e não em pilha, como o HotSpot (devido à natureza dos processadores ARM versus os que o HotSpot tinha como alvo [como IA32]), é o uso do Zygote e o conceito de arquivos odex (ou seja, toda a idéia de não [indo mais ou menos do arquivo de classe para o carregador de classes), tratar o Dalvik como uma JVM normal provavelmente levará a alguns conceitos errados. Especialmente porque muitos dos detalhes da implementação do HotSpot são frequentemente associados erroneamente às JVMs em geral (como o compilador JIT).
Selali Adobor 22/09/14
2

Como essa é uma pergunta ampla, aqui está uma resposta ampla.

"Os aplicativos iOS são mais rápidos que os aplicativos Android, pois os aplicativos Android são interpretados?"

Primeiro, os aplicativos para iOS não são "mais rápidos que" os aplicativos para Android.

Em segundo lugar, sobre o problema "Os aplicativos Android são interpretados". Isso é algo que você diria sobre computação, como "15 anos atrás": como você pode ver na discussão acima, a situação é muito mais complicada hoje; tecnologias inteiramente novas vieram à tona. O conceito "compilado é mais rápido do que interpretado!" foi relevante comparar, você sabe, perl com código de máquina há 20 anos; as coisas mudaram tanto que o problema não pode ser realmente claramente aplicado ao "iOS V Android" hoje.

Em terceiro lugar, há outros problemas na programação móvel que inundam totalmente essas considerações. Apenas um exemplo, os programadores móveis se empenham em lidar com grandes listas de rolagem de imagens, carregamento lento e problemas semelhantes. A maneira como os dois sistemas operacionais e as várias bibliotecas populares lidam com esses problemas críticos geralmente afasta outros.

Em quarto lugar, apenas mais uma questão esmagadora nos celulares são os problemas do chipset gráfico e os vários relacionamentos complicados disso com o software, o OpenGL e assim por diante. Por exemplo, a Apple está lançando um sistema que eles chamam de "Metal" em relação a esses problemas, e o Android está lançando seu próprio "coisinha" nesse campo. Esses problemas em torno do pipeline de gráficos são extremamente importantes para a sensação dos aplicativos na sua mão.

A resposta muito curta à sua pergunta é "V compilado interpretado" é basicamente um ponto de discussão desatualizado, você sabe?

(Além disso, eu particularmente não acho o Note3 "mais lento" do que o iPhone. Além disso, parte disso é puro artefato - existem telefones Android baratos: simplesmente não existem iPhones de baixo desempenho, portanto algumas pessoas podem estar incorretas idéias a partir disso.)

Fattie
fonte
-3

Porque aplicativos interpretados não significa que eles sempre são lentos. Às vezes, eles são mais poderosos e dinâmicos em comparação com o compilado. Como todos os códigos no aplicativo compilado são compilados uma vez e a saída é mantida na forma de bibliotecas ou executáveis, enquanto na linguagem interpretada, uma vez pode alterar aleatoriamente a sequência de execução. Então, eu posso dizer, depende de desenvolvedor para desenvolvedor e não há maneira de programação.

No entanto, Java (linguagem de programação do Android) não é interpretada, mas é compilada pelo JIT. Isso significa que os programas Android são compilados pouco antes de você executá-los, oferecendo um desempenho razoavelmente semelhante ao objetivo C. do iOS

Mais recentemente, a estrutura ART do Android pré-compila os aplicativos, para que sejam executados da mesma maneira que os aplicativos iOS. Em outras palavras, a próxima versão do Android provavelmente será tão rápida quanto o iOS.

Atualizar

As linguagens de programação geralmente se enquadram em uma de duas categorias: Compiladas ou Interpretadas. Com um idioma compilado, o código digitado é reduzido a um conjunto de instruções específicas da máquina antes de ser salvo como um arquivo executável. Com idiomas interpretados, o código é salvo no mesmo formato que você inseriu. Os programas compilados geralmente são executados mais rapidamente que os interpretados porque os programas interpretados devem ser reduzidos às instruções da máquina em tempo de execução. No entanto, com uma linguagem interpretada, você pode fazer coisas que não podem ser feitas em uma linguagem compilada. Por exemplo, programas interpretados podem se modificar adicionando ou alterando funções em tempo de execução. Também é geralmente mais fácil desenvolver aplicativos em um ambiente interpretado porque você não precisa recompilar seu aplicativo sempre que quiser testar uma pequena seção.

See-Sharp
fonte
1
o que quer dizer "uma vez que pode mudar aleatoriamente a seqüência de execução e como eles são mais poderosa e dinâmica também im não dizendo que eles são lentos, só que eles são mais lentos, até mesmo um pouco?.
Armon Safai
3
Isso não é inteiramente verdade. É enganoso dizer que não é necessário recompilar é uma vantagem, pois você ainda precisa criar um arquivo APK e implantá-lo no dispositivo de teste. O Google não decidiu usar o Java: o Android já era baseado em Java antes de o comprar. Os arquivos APK não contêm o código "no mesmo formato que o [programador] inseriu".
Dan Hulme
1
O Microsoft .NET é compilado no código IL, que também é interpretado da mesma forma que o java é compilado no bytecode.
Esben Skov Pedersen
12
Muitas informações nesta resposta realmente não são relevantes ou tecnicamente corretas. Eu sinceramente sugeriria que essa resposta fosse totalmente revisada para precisão técnica.
Aza
2
Java geralmente não é uma linguagem interpretada , a menos que você esteja lidando com uma implementação incomum da JVM. A compilação do JIT não é a mesma coisa que um intérprete, portanto, a maior parte dessa resposta é honestamente irrelevante no contexto do desempenho do Android, pois ele usa o JIT.
Eldarerathis