UNE CLASSE DE CHRONO QUI VA JUSQU'A LA NANOSECONDE !

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 17 sept. 2005 à 11:55
themadmax Messages postés 4 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 28 mars 2007 - 28 mars 2007 à 16:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33821-une-classe-de-chrono-qui-va-jusqu-a-la-nanoseconde

themadmax Messages postés 4 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 28 mars 2007
28 mars 2007 à 16:23
Supposition d'amelioration :

class PerfChrono
{
///la frequence de l'horloge
__int64 m_freq;
///Temp initial
__int64 m_t0;
public:
enum Unit { ms, micros, nanos };
PerfChrono(void);
~PerfChrono(void);
void start(void);
DWORD getDiff(Unit unit = ms);
};
Zyph0s Messages postés 2 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 2 juillet 2006
2 juil. 2006 à 17:03
Voici la solution, empêcher le changement de core du thread. Comme expliqué ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/Game_Timing_and_Multicore_Processors.asp

Il suffit de forcer le thread sur un CPU, ici sur le premier CPU en ne donnant l'affinité qu'à un seul processeur, ici le premier
SetThreadAffinityMask(GetCurrentThread(),1);

plus d'info sur :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setthreadaffinitymask.asp
Zyph0s Messages postés 2 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 2 juillet 2006
2 juil. 2006 à 16:45
Ce code ne marche pas sur un processeur Multi-core. Sauf si on le force sur un seul core. Quelqu'un a une solution ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2006 à 15:27
Un appel system + 1 multiplication et 1 division
Tu penses gagner quoi en ASM ?
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
28 mars 2006 à 14:39
Si ça intéresse quelqu'un, je vais peut-être refaire une version de la classe en assembleur pour la rendre plus rapide à l'éxécution. Dès que je l'aurais finie, je la posterai sur asmfr.com.
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
28 mars 2006 à 14:28
--> Ordepedro

Ca ne doit pas influer beaucoup(une mise de valeur dans la pile) donc c'est une bonne idée. Je vais rajouter ça dans la classe.
Ndisalvio Messages postés 3 Date d'inscription jeudi 16 février 2006 Statut Membre Dernière intervention 27 avril 2006
16 févr. 2006 à 13:23
En fait je pense que c'est le temps d'executer la classe qui fait que le temps trouve est légèrement supérieur à 10ms (en Ns bien shur)
ordepedro Messages postés 1 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 janvier 2006
22 janv. 2006 à 12:17
Merci pour ton code nightlord666, il va m'être bien utile.
Sinon petite question: Pourquoi ne pas remplacer les 3 fonction GetDiff... par une seule du genre ?

#define mS 1000
#define uS 1000000
#define nS 1000000000

DWORD GetDiff(UINT Unite) //'Unite' prenant les valeure mS uS ou nS
{
__int64 t1;
QueryPerformanceCounter((LARGE_INTEGER*)&t1);
return (DWORD)(((t1 - t0) * Unite) / freq);
}

Est ce que c'ette écriture influe sur le résultat ou sur la rapidité du code ?
vangeurmasker Messages postés 99 Date d'inscription mercredi 12 mai 2004 Statut Membre Dernière intervention 29 mars 2006
24 oct. 2005 à 15:09
Deux petits commentaires
- 1 seconde 10e9 nanosecondes> 10 millisecondes = 10 000 000 nanosecondes
- la fonction sleep ne permet en aucun cas de faire une pose précise.

Sinon cette source est bien hormis la faute ligne 46 il manque un zero
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
20 sept. 2005 à 18:57
bweps -> Bah j'ai testé et avec 23 processus lancés, j'arrive à une précision à 10 nanosecondes près...

dominion -> Je ne sais pas, le meilleur moyen est de regarder à l'execution du programme la ligne : "10 millisecondes = xxx nanosecondes". Comme ca tu voit bien la précision : plus la valeur xxx s'approche de 10000, plus c'est précis.
bweps Messages postés 17 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 10 mai 2007
19 sept. 2005 à 14:55
J'ai fait une classe qui permet de ne mesurer le temps que d'un processus, mais apparemment personne n'en voit l'intérêt... Si vous voulez voir,
http://www.cppfrance.com/codes/UNE-CLASSE-SIMPLE-EN-C-POUR-MESURER-LE-TEMPS-D-EXECUTION-D-UNE-PORTION-DE-CODE-SUR-UNE-MACHINE-NON-DEDIEE-AUX-TESTS-WINDOWS-/33788.aspx
bweps Messages postés 17 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 10 mai 2007
19 sept. 2005 à 14:52
salut, je vais être lourd, mais ça ne vous dérange pas que votre mesure prenne aussi en compte le temps d'exécution de toutes les applis qui tournent en même temps, alorss que vous cherchez une précision si grande ?
cs_dominion Messages postés 230 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 15 mai 2008
19 sept. 2005 à 01:27
nightlord666 << Le prog marche, ok... Mais moi je parlais de la précision du calcul... Tu vois un chiffre mais d'après ce qu'on m'a dit la précision du dit chiffre dépend de la carte mère (ce qui paraît logique). Je voulais juste confirmation ;-)
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
18 sept. 2005 à 16:26
dominion ► Je ne sais pas mais moi ça marche sur ma carte mère toute pourrie alors ça devrait marcher sur ton ordi. Essaie le programme et comme ça tu es sur.

Urgo ► Merci, je vais corriger ça dès aujourd'hui.
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
18 sept. 2005 à 15:52
Le langage (sans "u" en français), svp!
cs_dominion Messages postés 230 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 15 mai 2008
18 sept. 2005 à 00:56
J'ai entendu dire que la nanoseconde ne peut être calculée que par des ordis nouvelle génération (P4 ou XP+)... Est-ce vrai ???