Bonjour,
Je suis depuis un certain temps sur la programmation d'un projet personnel en C. Après avoir fait la majeur partie du en développant en 32 bits, j'ai par la suite utilisé la suite mingw-w64 pour faire mes binaires en 64 bits (j'utilisais mingw32 pour mes binaires en 32 bits). Le fonctionnement du programme est nickel sur les deux. Par contre, je rencontre un problème de lenteur important avec mingw-w64 lors de l'éxécution (qui peut varier de 6x à 90x plus lent que la version 32 bits, dépendant de ce qui est demandé). Ainsi, j'ai tenté de faire des tests et je suis venu à trouver un code minimal qui est beaucoup plus lent lorsqu'il est compilé sous mingw-w64 que lorsqu'il est fait avec mingw32, que voici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 #include <stdio.h> int main(int argc, char *argv[]) { printf("%d\n",sizeof(void*)); int i=0; long long segpa; long long segpa2; long long segpa3; long long segpa4; long long segpa5; long long segpa6; long long segpa7; long long segpa8; while(i<1000000000) { *((int*)&segpa)+=100; *((int*)&segpa2)+=(i*2); *((int*)&segpa3)+=300; *((int*)&segpa4)+=segpa8; *((int*)&segpa5)+=segpa7; *((int*)&segpa6)+=segpa; *((int*)&segpa7)+=segpa6; *((int*)&segpa8)+=segpa2; i+=1; } printf("%d",segpa); printf("%d",segpa2); printf("%d",segpa3); printf("%d",segpa4); printf("%d",segpa5); printf("%d",segpa6); printf("%d",segpa7); printf("%d\n\n\n",segpa8); return 0; }
La temps d’exécution est de 2.5 secondes en 32 bits, et de un peu moins de 13 secondes en 64 bits (Sur un Intel I5-4690 à 3.50Ghz). Désolé si le code est un peu étrange, je voulais que le compilateur ne puisse pas optimisé les variables inutilisés et les résultats qui étaient possible de prévoir.
J'utilise aussi beaucoup de déférencement de pointeur (autant dans l'exemple, que dans le programme complet) , qui semble être ce qui pose problème. J'ai essayé pas mal tout les paramètres d'optimisations du compilateur, mais rien n'y change. J'ai essayé de compiler ce code exemple sur MSVC, la version 64 bits est très légèrement plus rapide que la 32 bits, mais aucune différence vraiment remarquable. La vitesse dans les deux cas est comparable aux résultats avec Mingw32.
Avez-vous déjà eu ce genre de problème? Est-ce possible d'écrire mon déférencement d'une meilleur façon pour éviter que le compilateur génère du code aussi lent? Est-ce quelque chose de normal? Ai-je fait une bourde?
Merci de votre aide!
Si j'e n'ai pas été assez clair ou quoi que ce soit ,n'hésitez pas à me demander plus d'informations.
Partager