Est-ce que un logiciel compilé directement sur la machine et un binaire compilé pour l'architecture auront les mêmes performances ?
Ce n'est pas la bonne question. Si tu utilise les memes flags de compilation, alors le binaire sera le meme. Cependant, certains flags de compilation sont "dynamiques" (-march=native -mtune=native) et regarde ce qu'il y a dans la machine et ajute les flags de compilation en fonctions. Dans ce cas, la difference entre compiler sur une machine ou compiler sur une autre sera existant.
Cepandant, il faut aussi voir ce que l'application fait pour savoir si il va y avoir une difference en pratique. Un programme comme ls, par exemple, fait juste une suite d'appel de bas niveau. Tu pourrais l'ecrire en javascript qu'il ne serait pas bien plus lent. Mais un prgoramme qui fait beaucoup de calcul, par exemple un compresseur audio, est plus calculatoire.
Aussi il faut voir qu'il y a une difference entre optimiser pour une ISA donne. Et optimiser pour une architecture donne. Optimiser pour une ISA dis juste que tu t'authorise a emettre certaine instruction, comme par exemple les extensions AVX. Mais ca ne veut pas forcement dire que ca va s'executer plus vite. Par exemple, certaines architecture ont une operation Fused-Multiply-Add, mais n'ont pas de support physique pour executer le FMA. Le processeur se contente de decoder le FMA avec un MUL et un ADD en microcode, ce qui n'apporte pas grand chose en terme de performance (juste un load d'instruction).
Les aspect de performances dependent souvent de l'architecture du processeur et de comment le code est ecrit. Combien il y a de port d'execution dans le back-end? Quel est la taille du cache? Quel est la latence du cache? Quel est la bande passante memoire? ...Et tu peux vouloir generer des codes differents en fonction de ces parametres.
En vrai, j'imagine que la vraie question etait "est ce que ca vaut le coup de recompiler ses software comme un gentoo-eux?" Et la reponse est "probablement pas". Si il y a une difference de performance utile en fonction de la compilation, les libs generent probablement differentes version du code et utilise la bonne version au runtime. (MKL, av, ...)