Dove rientra Objective-C nel continuum delle prestazioni linguistiche?


20

Sembra che ci sia molta discussione sui vari meriti della velocità rispetto a C o C ++ rispetto a Java o Python, ma raramente vedo menzionato Objective-C. All'incirca dove rientra in termini di prestazioni linguistiche?


23
1986 - Brad Cox e Tom Love creano Objective-C, annunciando "questo linguaggio ha tutta la sicurezza della memoria di C unita a tutta la velocità ardente di Smalltalk". Gli storici moderni sospettano che i due fossero dislessici. ( fonte )
Mason Wheeler,

4
Rientra nella gamma in cui le prestazioni non contano molto. È l'unico linguaggio supportato per l'interfacciamento con Cocoa, quindi se vuoi farlo, nient'altro funziona affatto. Per qualsiasi altra cosa, la considererei una scelta terribile, indipendentemente dalle prestazioni.
Jerry Coffin,

1
"performance" non è una caratteristica di una lingua, ma di un'implementazione della lingua e, soprattutto, dei programmi scritti in quella lingua. Puoi scrivere programmi molto veloci in Objective-C, oppure puoi scrivere programmi molto lenti.
Caleb,

Non riesce ad avere una sintassi orribile, ma non è un linguaggio male performante basato sui suoi compilatori attuali poiché le prestazioni sono più basate sul compilatore / VM che sul linguaggio reale.
Rig

Risposte:


28

A differenza di C ++, Objective-C è progettato come un superset pulito di C. I pochi compilatori Objective-C che ho usato sono meglio conosciuti come compilatori C, ma gestiscono anche Objective-C.

Quindi, è sicuro supporre che nel livello di generazione del codice, C e Objective-C siano equivalenti.

La prima differenza appare nell'ABI OOP, chiamata anche "associazione del metodo tardivo". Proprio come in C ++, Objective-C si basa su tabelle di puntatori di funzioni generate dal compilatore che vengono attraversate in fase di esecuzione.

A differenza del C ++, tuttavia, il metodo di associazione è più "dinamico" e promuove l'uso della idsuperclasse ovunque, rendendolo leggermente più lento del C ++ in teoria. In pratica, questa differenza è molto al di sotto misurabile.

Infine, il problema di prestazioni più importante è la qualità delle librerie utilizzate. Poiché Objective-C è molto popolare solo nei sistemi Apple, è ragionevole supporre che lo stai usando con Cocoa; che è un bel set di librerie di alto livello. Nella maggior parte dei casi, puoi lasciare il sollevamento pesante a loro, quindi il tuo codice non deve essere così veloce, o se fai un forte scricchiolio, allora è probabile che sia una base di codice per lo più statica, approssimativamente simile alla semplice C .

TL; DR: è proprio lì con i linguaggi C e C ++ dove conta di più. Se non stai ottenendo buone prestazioni, controlla i tuoi algoritmi; proprio come in qualsiasi linguaggio serio.


4
In effetti il ​​moderno obiettivo-c è supersetty come il moderno C ++. In C puoi fare l'aritmetica su puntatori arbitrari, non puoi in ObjC. Anche la differenza di prestazioni dovuta alla ricerca del metodo è misurabile: il percorso veloce di objc_msgSend è circa quattro volte più pesante di una chiamata di funzione membro (ei percorsi lenti non sono veloci come il percorso veloce).

11

Objective-C è più lento di C / C ++. Il motivo è il runtime di Objective-C che invia dinamicamente le ricerche dei metodi in fase di runtime allo stesso modo di Smalltalk, da cui ha assunto questo modello di esecuzione. Invia tutti i metodi in fase di runtime è chiamato "invio di messaggi veri" in contrapposizione alla chiamata di funzione in C / C ++ in cui l'indirizzo della funzione viene determinato al momento della compilazione (ad eccezione dei metodi virtuali C ++). Ma non posso dire quanto sia più lento Objective-C. ASAIK viene utilizzato solo per lo sviluppo di applicazioni a causa della penalità prestazionale.


1
Trovato questo confronto delle prestazioni con C: rmarcus.info/?p=488 Sembra che Objective-C sia comunque abbastanza vicino a C.
OlliP,

Sarebbe bello confrontare l'Obiettivo C con il resto del branco nel gioco di Benchmarks
Deer Hunter,

Penso che il confronto delle prestazioni debba essere preso con un po 'di sale poiché il codice Objective-C è in qualche modo estendere il codice C e non l'invio di messaggi Objecttive-C. Non so a cosa serva la riduzione. Ho fatto lo sviluppo di Smalltalk per oltre un decennio e Objective-C si basa su Smalltalk in molti modi. Penso di sapere di cosa stavo parlando.
OlliP il

Non il downvoter; sono principalmente interessato agli algoritmi fortemente numerici, l'invio dinamico non ha molta importanza in quelli.
Deer Hunter,

8

Risposta breve: è compilato in un formato simile a C / C ++ / D / Go / Rust. Non utilizza un ambiente virtuale come Java / .Net. E non è interpretato come Python / Ruby / Lua / JavaScript. Quindi è all'estremità più veloce dello spettro.


7

Le differenze di velocità fondamentali tra Obj-C e C / C ++, come dice Oliver di seguito, sono dovute alla spedizione dinamica del metodo.

Questo articolo illustra questo sovraccarico in Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946

Fornisce anche un trucco molto utile per ottimizzare il codice Obj-C quando si determina che il metodo di invio (ovvero objc_msgSend) è il fattore limitante: ottenere una volta un puntatore alla funzione e usarlo per chiamare la funzione più volte. Non dovrebbe essere di grande aiuto poiché i runtime Obj-C eseguono automaticamente questa ottimizzazione .

Si noti che il vero costo dell'invio del metodo dinamico è dovuto a errori della cache, poiché interrompe la previsione del ramo della CPU. Questi sono difficili da profilare e può darsi che il codice sopra citato non misuri il vero costo mancante della cache.

Qualche discussione più utile è qui: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

In conclusione: le maggiori differenze tra le lingue sono i tuoi algoritmi. Oltre a ciò, esiste una differenza di velocità fondamentale tra Obj-C, C e C ++, dovuta alla spedizione dinamica o virtuale del metodo. Questo secondo punto non sembra essere grande. E l'articolo sopra fornisce un trucco per ottimizzarlo, se è possibile trovare hot spot tramite profilazione, che può essere difficile a causa di mancati cache della CPU.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.