Rendimiento en Swift con cocoa

Dado que los libanes de cocoa (Foundation, UIKit, CoreData, etc.) están escritos en Objective-C y no se han convertido a Swift (¿todavía?), Aún obtenemos los beneficios de performance que Swift ofrece al llamar a estas libreas de cocoa en Swift vs. libarias junto con Objective-C (que ha sido el caso hasta ahora)?

Erm …

Los frameworks del sistema son los frameworks del sistema. Realizarán el mismo independientemente del idioma del que se les llame.

Apple tiene millones de líneas de código en sus frameworks. (probablemente cientos de millones de líneas). Dudo si van a convertir en masa todos esos frameworks a Swift. En cambio, a medida que actualizan y amplían sus frameworks, es probable que utilicen Swift en lugar de Objective C cuando sea apropiado, y luego proporcionan interfaces para ambos idiomas. Es probable que la transición en el código de Apple esté limitada a nuevas API y / o API en las que realicen una importante revisión por algún otro motivo.

Cuando miras el performance de una aplicación, por lo general se networkinguce a una pequeña cantidad de código que es el cuello de botella y ocupa la mayor parte del time. Optimizar otras partes de su progtwig tiene muy poco efecto.

Si su progtwig termina gastando la mayor parte de su time en frameworks de aplicación, entonces no importa si está escrito en Objective C, Swift, ensamblador nativo o Java.

Personalmente, soy muy escéptico sobre las afirmaciones de Apple sobre los enormes beneficios de performance de Swift. Sospecho que sus comparaciones deliberadamente eligieron problemas que tienen características de performance muy malas cuando se escriben en "puro" Objective-C (ignorando el hecho de que Objective-C es un verdadero superset de C, y siempre se puede escribir código C en un Objective-C progtwig.)

Soy un viejo jinete de ensamblador y un progtwigdor de C después de eso. Cuando hago el layout de la aplicación, evito crear objects que representen átomos diminutos de datos, minimizan las asignaciones de memory en loops ajustados e incluso a veces escriben códigos críticos usando funciones C en lugar de llamadas a methods Objective-C. Ya optimizo mi layout e implementación con una conciencia de lo que ralentiza los progtwigs. Me atrevería a apostar que con este enfoque, la diferencia entre el código Swift y Objective-C es pequeño. Si tenemos less control en Swift sobre lo que es un object y lo que es una matriz simple de valores escalares, espero que una encoding cuidadosa aún genere un mejor performance con una combinación de C y Objective-C.

Otro punto es que usualmente sus algorithms marcan mucha más diferencia que su implementación. Si usas un tipo de burbuja en un millón de loggings, será lento para perros, incluso si escribes la implementación más inteligente y más optimizada de un tipo de burbuja.

Ejemplo:

Nuestra empresa tiene un progtwig Mac, FractalWorks , (enlace) en la tienda de aplicaciones Mac. Es un renderizador de fractal de muy alto performance. Internamente, asigna un bloque de memory para almacenar resultados, y luego usa el código C cuidadosamente diseñado para hacer el crujido de numbers. Es multi-threaded, y mantiene cada núcleo en su Mac "al máximo" hasta que se hagan los cálculos. Cuando es posible, también usa el conocimiento de la geometry de Mandelbrot y Julia para usar un algorithm de "seguimiento de límites", y rastrea el exterior de regiones que tienen el mismo "valor de iteración", y luego llena-inundar toda la región, por lo tanto a menudo ahorrando millones o incluso miles de millones de costosos cálculos de punto flotante. La primera parte, utilizando búferes de memory y código C para calcular los resultados, es la optimization de la implementación. El segundo bit, el algorithm de seguimiento de límites, es una optimization de algorithms, y para los problemas en los que es un buen ajuste, puede networkingucir la cantidad de cálculos en 5X o incluso 10X.