C, 115 octets
#include<math.h>
#define D(K,L)K(x){return L;}
D(q,0)D(w,x+x)D(e,x*x)D(r,pow(x,x))(*g[])()={q,w,e,r};D(f,g[x%4](x))
L'exemple est une fonction int f(int x)
Il prétend la vitesse de travail la plus rapide car il empêche le CPU d'utiliser des sauts conditionnels. Et ce n'est que la manière correcte d'optimiser la vitesse pour cette tâche. En outre, il essaie de ne pas tout évaluer, comme dans l'exemple du tableau C, return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
mais d'utiliser judicieusement le tableau de pointeurs vers les fonctons, afin de faire des sauts inconditionnels beaucoup plus rapides (jmp / call) avec une arithmétique d'adresse beaucoup plus rapide, comme une version optimisée de " switch () - case .. ". Cette technique pourrait également être utile dans plusieurs types d'automates finis - comme les émulateurs de processeur, les exécuteurs, les analyseurs de flux de commandes, etc. - où la vitesse est importante et le code comme switch(x%4) case(0):... case(1):...
ne convient pas car elle produit plusieurs instructions cmp / jnz; et ce sont des opérations coûteuses pour le CPU
Le programme de test le plus simple et le plus court (dans les conditions par défaut) pour le cas sera le suivant:
D(main,f(x))
Il ajoutera seulement 12 octets de charge utile et totalisera notre taille à 127 octets;
Mais il vaut mieux dire à l'éditeur de liens d'utiliser la f
fonction comme point d'entrée au lieu de main
. C'est le moyen, si nous visons à obtenir le binaire de travail le plus rapide possible pour cette tâche à partir du code le plus court ;-) Cela se produit car la bibliothèque C ajoute du code init / shutdown supplémentaire avant d'appeler votre fonction main ().
Le code se compile sur MSVS Community 2015 sans trucs et problèmes et produit des résultats corrects. Je ne l'ai pas testé avec gcc, mais je suis sûr que cela fonctionnera aussi bien.
0
cas êtrex + 2
, car comment les autres sontx * 2
,x ^ 2
etx ^^ 2
(tétration)? : P