Bonjour,
J'ai actuellement à la maison, ces architectures suivantes : je vous donne l'année ça ira plus vite
- Asus Rog i7 (2016)
- Lenovo i5 (2016)
- A8 (2015)
- Asus i5 (2015)
- Lenovo i3 (2014)
- Sony vaio i5 (2012)
- Sony P4 (2003)
- VirtualBox
- QEmu
- VMWare
Sous FreeDos 1.2 (DOS), j'ai un programme C++ compilé avec GCC 6.2/G++ en C++17 qui lit EN BOUCLE:128 fois un fichier de plus de 100ko sur le disque en traitant des opérations mémoires, grosses et petites allocations dynamiques, imports de fonctions externes, bref des opérations assez lourdes après la récupération du contenu du fichier.
Ces opérations tous displayed sur le stdout, et elles prennent environs ~50ms chacune. Donc 6 secondes au total, selon le PC.
Je maintient fortement que le code fonctionne parfaitement sur tous les PC cités ci-dessus sans optimisation, donc -O0.
Mon problème
J'ai donc voulu utiliser le flag -O (1, 2, ou 3) afin d'optimiser ces opérations. Voici le résultat :
Je retiens que ces optimisations m'ont permis de gagner au moins 3x plus de temps, je passe de 6 secondes à 2 ou 3 secondes selon le PC.
- Asus Rog i7 (2016) --> CRASH à la 1ere boucle
- Lenovo i5 (2016) --> CRASH avant la boucle
- A8 (2015) --> CRASH à la 2eme boucle
- Asus i5 (2015) CRASH un peut hazardeusement
- Lenovo i3 (2014) --> CRASH un peut hazardeusement, mais ça passe
- Sony vaio i5 (2012) --> OK
- Sony P4 (2003) --> OK
- VirtualBox --> OK
- QEmu --> OK
- VMWare --> OK
- DosBox --> OK
CRASH se rapporte à un SIGSEGV ou un Page Fault
J'ai essayé les architectures i386, i486, i586 et i686.. Même problème..du coup je dois rester au -O0
L'optimisation qui crash sur certains PC... Plus ils sont récents plus ça crash!! Utilisation du SSE mal géré ? Quelqu'un aurai une explication ?
Merci
Partager