sBibi :
han, ca sent le petit prodige incompris et non reconnu qui se sent plus peter pke il a code un truc qu'il estime etre bien et innaccessible a toutes ces pauvres larves rempant sur les forums qui OSENT (c) le contredire et qu'il se fait un devoir d'eclairer avec son immense savoir? 
Ah p't'être bien tiens, vu sous cet angle

Bwaaaaa...
Pollux :
tu racontes des conneries en insultant les autres
Où ça ? Où ça j'insulte ? J'emet juste de 'profondes' réserves vis-à-vis des 'extraordinaires' performances du cache, y'a rien de répréhensible à cela :/ Regarde la démonstration par l'absurde :
Pollux :
on est pas du tout dans les facteurs 10 de cache vs pas cache
Puis :
Pollux :
Avec 200ko de mémoire allouée, ça prend 6.75 secondes ; en en faisant tourner 3 simultanément, ça prend exactement le même temps (tiens tiens) ; et en en faisant tourner un seul avec 3x plus de mémoire (donc ça ne tient plus du tout dans le cache) ça prend quasiment 3 minutes
Exact dans un sens, 22 fois plus rapide exactement (d'après ton test, attend la suite). Mais je doute fort que tous les processus s'amusent à réserver directement sur la pile avec
alloca, mais plutôt avec
malloc, voire avec
new (quoique j'ai pas vu de difference avec Visual C, alloca et malloc, mëme combat).
Ton exemple est vicieux vu qu'il consiste à faire 100000 'simple' écritures sur la taille d'un tableau (taille passée en paramètre). Or dans un cadre d'utilisation 'normale' (c'est à dire pas juste avec des routines simples pour faire cracher les chiffres), y'a le processeur qui s'en mèle pour faire des calculs savants, des branchements divers (qui eux invalident le prefetch), etc...
Mon processeur, un Athlon 1700+ (L1 core et data de 64 Ko, L2 de 256 Ko, même caractéristiques que ton 2600+), donne les résultats suivant avec ton code avec comme paramètre :
40000 -> 7 secondes
80000 -> 15 secondes (sortie du cache L1 de 65536 octets)
160000 -> 30 secondes
320000 -> 70 secondes (sortie du cache L2 de 262144 octets)
480000 -> 152 secondes
Je ne suis pas allé à 600000, vu que ce n'était pas la peine !
Il apparait qu'entre 40000 et 80000, il n'y a pas de différence si ce n'est que strictement un facteur de 2 (normal, 2 fois plus de données). Le cache L1 au même niveau que le cache L2 ? A la sortie du cache L2 (entre 160000 et 320000), je ne note qu'un facteur de 16% (70 secondes au lieu des 60 théoriquement prévues pour 2 fois plus de données). Concernant la différence entre 160000 (dans le cache L2) et 480000 (dehors), on obtient 68% (152/90) de différence par rapport au temps prévus (3 fois plus de données, mais 5 fois plus lent au lieu de 3).
Ce n'est donc MEME PAS 2 fois plus rapide, alors je ne comprend pas ton résultat de 22 fois (154.7/6.73) :/ Cette différence de 68% je l'obtient aussi sur mon 68030 (71% dans son cas) avec deux caches de 256 octets (on ne rit pas dans la salle, SVP) !
Dans l'exemple de PhotoShop, si tu ne veux pas entendre parler de la taille des routines executées par le processeur (ce qui concerne en fait le cache d'instruction) mais plutôt les données traitées (comme dans ton exemple), tu ne fais à peine tenir dans les 256 Ko de ton cache de donnée qu'une image de 320*240 en 24 bits. Pas très très représentatif des résolutions de la mort des cartes 3D actuelles, plutôt genre 1280*1024 (2.5 Mo en 16 bits, le double en 32 bits).
Je suis d'accord en ce qui concerne les perfs de l'IWRAM de la GBA, vu la taille de l'écran et donc la mémoire à traiter, mais ce n'est pas aussi recevable en ce qui concerne les PC. Eux, ce qui peu allègrement les booster, ce serait une utilisation plus massive des instructions SIMD (qui peuvent elles accélérer jusqu'à 8 foix le calcul), trop régulièrement snobées par les codeux. En s'accroche trop souvent au cache ou à la FSB... Quoique ça aide (à hauteur de 68% donc)
Pour te faire penser à ce que je viens de te dire, dis toi 'simplement' que l'un des composant essentiel du noyau de Windows, kernel32.dll, fait 'juste' 972 Ko. Bien sûr, il n'est pas chargé en entier dans le cache, juste les parties executées régulièrement. Mais kernel32.dll est loin d'être le seul composant appelé, y'a aussi gdi32.dll, 251 Ko !
D'ailleurs au fait, si on avait voulu optimiser un poil avec une vieille ruse d'apache, un 'for (i=100000-1;i>0;i--)' puis un 'for (j=n-1;j>0;j--)' auraient étés plus judicieux (pas de chargement de valeur, juste une comparaison avec 0). Mais bizarrement, c'est 45% plus lent sur un Athlon =:/ Va comprendre...
Et désolé de briser ton rève et de jouer un peu le garde-fou. Sans rancune, tes connaissances sont précieuses et je ne les remets pas en doute, n'ais de craintes... Moi ami !
Kochise
PS : Nah nah, moi pas BSD, moi TOS !
PS2, les liens classiques de Kochise :
http://www.cpuid.com
http://www.codeproject.com/cpp/HighPerfComp.asp : Un p'tit bench entre le CPU et le SIMD