Parece haver muita discussão sobre os vários méritos da velocidade em C ou C ++ em comparação com Java ou Python, mas raramente vejo o Objective-C mencionado. Aproximadamente, onde cai em termos de desempenho de idiomas?
Parece haver muita discussão sobre os vários méritos da velocidade em C ou C ++ em comparação com Java ou Python, mas raramente vejo o Objective-C mencionado. Aproximadamente, onde cai em termos de desempenho de idiomas?
Respostas:
Diferentemente do C ++, o Objective-C é projetado como um superconjunto limpo de C. Os poucos compiladores Objective-C que eu usei são mais conhecidos como compiladores C, mas também manipulam Objective-C.
Portanto, é seguro assumir que, no nível de geração de código, C e Objective-C são equivalentes.
A primeira diferença aparece no OOP ABI, também chamado de "ligação tardia do método". Assim como no C ++, o Objective-C conta com tabelas de ponteiros de função geradas pelo compilador que são atravessadas no tempo de execução.
Ao contrário do C ++, no entanto, o método de ligação é mais 'dinâmico' e promove o uso da id
superclasse em qualquer lugar, tornando-o um pouco mais lento que o C ++ na teoria. Na prática, essa diferença é bem abaixo da mensurável.
Finalmente, o problema de desempenho mais importante é a qualidade das bibliotecas usadas. Como o Objective-C só é realmente popular nos sistemas Apple, é razoável supor que você o esteja usando com cacau; que é um bom conjunto de bibliotecas de alto nível. Na maioria dos casos, você pode deixar o trabalho pesado para eles, para que seu código não precise ser tão rápido ou, se você faz um processamento pesado, é provável que seja uma base de código principalmente estática, aproximadamente semelhante à linguagem C .
TL; DR: está lá nas linguagens C e C ++, onde é mais importante. Se você não está obtendo um bom desempenho, verifique seus algoritmos; assim como em qualquer linguagem séria.
Objective-C é mais lento que C / C ++. O motivo é o tempo de execução do Objective-C, que envia pesquisas de métodos dinamicamente em tempo de execução da mesma maneira que o Smalltalk, do qual assumiu esse modelo de execução. Distribui todos os métodos em tempo de execução é chamado de "envio de mensagens verdadeiras" em oposição à chamada de função em C / C ++, em que o endereço da função é determinado no tempo de compilação (exceto para métodos virtuais em C ++). Mas não posso dizer o quanto mais lento o Objective-C é. O ASAIK é usado apenas para o desenvolvimento de aplicativos devido à penalidade de desempenho.
Resposta curta: Ele é compilado em um formato semelhante ao C / C ++ / D / Go / Rust. Ele não usa um ambiente virtual como Java / .Net. E não é interpretado como Python / Ruby / Lua / JavaScript. Por isso, está no extremo mais rápido do espectro.
As diferenças fundamentais de velocidade entre Obj-C e C / C ++, como Oliver diz abaixo, são devidas ao envio dinâmico de métodos.
Este artigo analisa essa sobrecarga no Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946
Ele também fornece um truque muito bom para otimizar seu código Obj-C quando você determina que o envio de métodos (por exemplo, objc_msgSend) é o fator limitante - obtenha um ponteiro para a função uma vez e use-o para chamar a função várias vezes. Isso não deve ajudar muito, pois os tempos de execução do Obj-C fazem essa otimização automaticamente .
Observe que o custo real do envio de método dinâmico é devido a falhas de cache, porque interrompe a previsão de ramificação da CPU. Eles são difíceis de definir e pode ser que o código mencionado acima não mede o verdadeiro custo de perda de cache.
Alguma discussão mais útil está aqui: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
Conclusão: as maiores diferenças entre os idiomas são seus algoritmos. Além disso, há uma diferença de velocidade fundamental entre Obj-C, C e C ++, devido ao envio de método dinâmico ou virtual. Este segundo ponto não parece ser grande. E o artigo acima fornece um truque para otimizá-lo, se você puder encontrar pontos de acesso via criação de perfil, o que pode ser difícil devido a falhas no cache da CPU.