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?
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?
Risposte:
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 id
superclasse 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.
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.
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.
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.