Dr. Zoidberg
Well-known-Papá Pitufo
Y no... por que el concepto de optimización es otro, y no es hacer dos cosas 100% diferentes y compararlas diciendo cual es mejor.. por que eso no tiene en cuenta al contexto que usa el compilador para optimizar, y que no se extiende a una sola función.Para mí si es una optimización, tengo dos formas de llegar y una resulta mucho más rápido que la otra, sin dudas esa última está optimizada, no importa como.
Y acá que la comparación no es correcta (y si importa el como) por que en el ejemplo en assembler de este post vos usás los registros del micro mientras que en C usás variables en RAM al no declarar las variables como register (si bien es una sugerencia). El compilador siempre optimiza para usar RAM, ya que los registros son bastantes "escasos" a menos que optimicés para velocidad... y aún así. Esas optimizaciones se hacen con un profiler en tiempo de ejecución y no en tiempo de compilación .
Mal hecho!!! Ves que lo que te digo es cierto???? Por que no probaste y perfilaste el comportamiento de esas funciones..???De hecho hay funciones intrínsecas en gcc para suplir esas instrucciones y por lo que averigüe no son del todo útiles, aunque admito que no llegué a probarlas, decidí usarlas directamente en assembler.
Otra vez comparamos mal!!! Las instrucciones especiales SIMD trabajan en paralelo, mientras que el código que has usado en C es netamente secuencial. Si no hay forma de indicarle al compilador que debe generar código SIMD, la unica solución es hacerlo a pedal en assembler... o usar otro compilador (tené en cuenta que el GCC es un compilador multiplataforma, así que no le importa mucho lo que sea particular de cada micro.. al menos hasta que la comunidad desarrolle algo para explotar - opcionalmente - las características especiales).No quiero hacer offtopic, pero en este post dejé un ejemplo de eso en una rutina bastante sencilla en C, assembler básico y usando las instrucciones especiales: https://www.forosdeelectronica.com/posts/1000184/ Admito que la "forma" de medir el tiempo deja bastante que desear, lo ideal sería usando un contador de intrucciones en assembler, cosa que de hecho existe, pero lamentablemente no pude utilizarla con éxito.
jajajajajaja!!!!Edito:
Y si, usé un puntero void.