time() sous windows

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

time() sous windows

Message par cdeval » sam. déc. 04, 2021 9:27 am

Bonjour,
j'ai cherché à faire des tests de performance avec ma librairie giac compilée avec MSVC mais la fonction giac time() me renvoie toujours 0.
J'ai commenté #define HAVE_NO_SYS_TIMES_H dans config.h et adapté le code pour reproduire les fonctions de <sys/times.h> (soit avec https://www.codefull.net/2015/12/systim ... r-windows/, soit avec <ctime> de MSVC) mais je continue d'obtenir 0.
Y a-t-il autre chose que je pourrais tenter pour faire marcher time() ?

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: time() sous windows

Message par cdeval » sam. déc. 04, 2021 10:41 am

Je viens d'installer xcas 64 mingw et je vois que time() renvoie toujours 0 aussi.
Par contre ça marche avec xcas 64 cygwin.

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: time() sous windows

Message par parisse » dim. déc. 05, 2021 8:50 am

Je vois, je vais essayer de faire fonctionner time() avec mingw.

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: time() sous windows

Message par parisse » dim. déc. 05, 2021 1:41 pm

Voila, ca devrait marcher avec ca dans la fonction _time() juste avant le #if defined(__APPLE__) || defined(PNACL)

Code : Tout sélectionner

#if defined VISUALC || defined __MINGW_H
    struct _timeb timebuffer0,timebuffer1;
    _ftime(&timebuffer0);
    for (;i<1000;){ // do it 10 times more
      for (;i<ntimes;++i){
	eval(a,level,contextptr);
      }
      _ftime(&timebuffer1);
      delta=(timebuffer1.time-timebuffer0.time)+double(timebuffer1.millitm-timebuffer0.millitm)/1000;
      if (delta>0.1)
	break;
      if (delta>0.05) // max wait time will be 2 seconds
	ntimes *= 2;
      else {
	if (delta>0.02) 
	  ntimes *= 5;
	else
	  ntimes *= 10;
      }
    }
    return (delta/ntimes);
#endif

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: time() sous windows

Message par cdeval » lun. déc. 06, 2021 7:29 am

Impec !
J'ai dû en plus faire ces modifications :
Dans config.h : commenter #define HAVE_NO_SYS_TIMES_H
Dans global.h remplacer sys/times.h par sys/timeb.h
Dans global.cc(5384) remplacer /sysconf(_SC_CLK_TCK) par /CLOCKS_PER_SECS (est-ce équivalent ? Si non, les tests que je rapporte plus bas ne seront pas fiables)
Dans global.h ajouter :

Code : Tout sélectionner

/* Structure describing CPU time used by a process and its children.  */
struct tms
  {
    clock_t tms_utime;          /* User CPU time.  */
    clock_t tms_stime;          /* System CPU time.  */

    clock_t tms_cutime;         /* User CPU time of dead children.  */
    clock_t tms_cstime;         /* System CPU time of dead children.  */
  };

/* Store the CPU time used by this process and all its
   dead children (and their dead children) in BUFFER.
   Return the elapsed real time, or (clock_t) -1 for errors.
   All times are in CLK_TCKths of a second.  */
clock_t times (struct tms *__buffer);
typedef long long suseconds_t ;
J'ai fait deux tests, répétés plusieurs fois pour stabiliser les temps :

Code : Tout sélectionner

$ ./giac_oo.exe
Expression : time(factoriser(makelist(n->x^n-1,1,100)))
// Warning: x, declared as global variable(s). If symbolic variables are required, declare them as local and run purge
Sortie giac : 0.0404
avec xcas cygwin64 :

Code : Tout sélectionner

[0.025,0.02354878]
Surprenant, je ne m'attendais pas à ça.

Code : Tout sélectionner

Expression : time(evalf(pi,100000))
Sortie giac : 0.000156
avec xcas cygwin64 :

Code : Tout sélectionner

[0.00042578125,0.00038788203125]
Cette fois, MSVC vainqueur.
Je n'ai pas compilé xcas mingw pour faire marcher time() mais je suppose que les résultats seront meilleurs qu'avec cygwin...
Bon c'était plus pour le fun car je suppose qu'en fonction de la nature du test et des fonctions sollicitées, les performances seront très variables...

Répondre