Onde o Objective-C se enquadra no continuum de desempenho do idioma?

20

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?

Fomite
fonte
23
1986 - Brad Cox e Tom Love criam o Objective-C, anunciando "esta linguagem tem toda a segurança da memória do C combinada com toda a velocidade escaldante do Smalltalk". Os historiadores modernos suspeitam que os dois eram disléxicos. ( fonte )
Mason Wheeler
4
Ela se enquadra na faixa em que o desempenho não importa muito. É a única linguagem suportada para fazer interface com o cacau, portanto, se você quiser fazer isso, nada mais funcionará. Para qualquer outra coisa, consideraria uma péssima escolha, independentemente do desempenho.
Jerry Coffin
1
"desempenho" não é uma característica de uma linguagem, mas de uma implementação de linguagem e, mais importante, dos programas escritos nessa linguagem. Você pode escrever programas muito rápidos no Objective-C ou programas muito lentos.
Caleb
Ele falha em ter uma sintaxe hedionda, mas não é uma linguagem com desempenho ruim com base em seus compiladores atuais, pois a performance é mais baseada no compilador / vm do que na linguagem real.
Rig

Respostas:

28

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 idsuperclasse 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.

Javier
fonte
4
De fato, o objetivo-c moderno é tão superconjunto quanto o C ++ moderno. Em C, você pode fazer aritmética em ponteiros arbitrários, não no ObjC. Além disso, a diferença de desempenho devido à pesquisa do método é mensurável: o caminho rápido de objc_msgSend é cerca de quatro vezes mais pesado que uma chamada de função de membro (e os caminhos lentos não são tão rápidos quanto o caminho rápido).
11

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.

OlliP
fonte
1
Encontrados esta comparação desempenho com C: rmarcus.info/?p=488 olhares como objectivo-C é, no entanto, bastante próximo C.
OlliP
Seria bom comparar o Objetivo C com o resto do pacote no jogo Benchmarks '
Deer Hunter
Eu acho que a comparação de desempenho precisa ser feita com um pouco de sal, já que o código Objective-C é, em certa medida, o código C, e não a mensagem Objecttive-C. Não sei para que serve a redução. Eu desenvolvi o Smalltalk por mais de uma década e o Objective-C é baseado no Smalltalk de várias maneiras. Eu acho que sei do que eu estava falando.
OlliP
Não é o downvoter; Como estou interessado principalmente em algoritmos fortemente numéricos, o envio dinâmico não importa muito dentro deles.
Deer Hunter
8

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.

Jacks_Gulch
fonte
7

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.

MHH
fonte