Il y a, à mon avis, un gros problème :
Désolé si le code est un peu étrange, je voulais que le compilateur ne puisse pas optimisé les variables inutilisés
Le compilateur est là pour optimiser. Si tu l'empêches de faire son travail, tu auras forcément de mauvais résultats. Dire que ce code est plus rapide avec mingw32 qu'avec mingw64 veut simplement dire que le premier s'en sort mieux que le second avec ce code compliqué. Et c'est tout le problème de l'optimisation : c'est du cas par cas, compilateur par compilateur, fonction par fonction. Même si certains grands principes restent, notamment celui de faire du code lisible et relativement que le compilateur arrivera à optimiser.
Pour enquêter sur les raisons de la lenteur de ton code sur 64 bits, il ne faut pas créer un code minimaliste différent de ton application, sauf si le but est de mon montrer un bug ou un réel défaut du compilateur. C'est peut-être d'ailleurs ton but ? Si tu veux "juste" améliorer ton application, il faut la profiler. Utilise un outil comme gproof, qui est fourni avec mingw32. Regarde les fonctions lentes avec mingw64. Regarde si ce sont les mêmes ou pas avec mingw32. Compare les codes assembleurs de ces fonctions. Cherche comme les améliorer.
Au passage, ton code compile mais avec plein de warnings avec mingw32 sur Windows 7 :
||=== Build: Debug in CodeBlocks (compiler: GNU GCC Compiler) ===|
main.c||In function 'int main(int, char**)':|
main.c|23|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|25|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|27|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|29|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|31|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|33|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|35|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|37|warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]|
main.c|42|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|43|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|44|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|45|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|46|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|47|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|48|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|49|warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]|
main.c|23|warning: iteration 42949673u invokes undefined behavior [-Waggressive-loop-optimizations]|
main.c|21|note: containing loop|
||=== Build finished: 0 error(s), 17 warning(s) (0 minute(s), 1 second(s)) ===|
Les printf(), ce n'est pas bien grave. L'aliasing, c'est pas bien du tout. Le dernier, je ne le connaissais pas, mais il me fait un peu peur.
Partager