New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DProf - poor timer resolution on BSDs (patch) #8984
Comments
From agrow@thegotonerd.comDevel::DProf should be calling getrusage(2) and gettimeofday(2) instead of Please have a look at the attached patch to DProf.xs. This change was discussed quite a while back but no patch came forth: -- |
From agrow@thegotonerd.comFlags: Site configuration information for perl v5.8.8: Summary of my perl5 (revision 5 version 8 subversion 8) configuration: Locally applied patches: @INC for perl v5.8.8: Environment for perl v5.8.8: |
From agrow@thegotonerd.combsd-getrusage.dprof-r44.diff--- DProf.xs.orig 2007-08-02 16:57:34.000000000 -0400
+++ DProf.xs 2007-08-02 16:54:09.000000000 -0400
@@ -69,25 +69,32 @@
# define Times(ptr) (dprof_times(aTHX_ ptr))
# define NEEDS_DPROF_TIMES
#else
-# ifndef HZ
-# ifdef CLK_TCK
-# define HZ ((I32)CLK_TCK)
-# else
-# define HZ 60
-# endif
-# endif
-# ifdef OS2 /* times() has significant overhead */
+# ifdef BSDish
# define Times(ptr) (dprof_times(aTHX_ ptr))
# define NEEDS_DPROF_TIMES
-# define INCL_DOSPROFILE
-# define INCL_DOSERRORS
-# include <os2.h>
-# define toLongLong(arg) (*(long long*)&(arg))
-# define DPROF_HZ g_dprof_ticks
-# else
-# define Times(ptr) (times(ptr))
+# define HZ 1000000
# define DPROF_HZ HZ
-# endif
+# else
+# ifndef HZ
+# ifdef CLK_TCK
+# define HZ ((I32)CLK_TCK)
+# else
+# define HZ 60
+# endif
+# endif
+# ifdef OS2 /* times() has significant overhead */
+# define Times(ptr) (dprof_times(aTHX_ ptr))
+# define NEEDS_DPROF_TIMES
+# define INCL_DOSPROFILE
+# define INCL_DOSERRORS
+# include <os2.h>
+# define toLongLong(arg) (*(long long*)&(arg))
+# define DPROF_HZ g_dprof_ticks
+# else
+# define Times(ptr) (times(ptr))
+# define DPROF_HZ HZ
+# endif
+# endif
#endif
XS(XS_Devel__DProf_END); /* used by prof_mark() */
@@ -224,7 +231,33 @@
times((tbuffer_t *)t);
return (clock_t) retval;
# else /* !VMS && !OS2 */
+# ifdef BSDish
+# include <sys/resource.h>
+ struct rusage ru;
+ struct timeval tv;
+ /* Measure offset from start time to avoid overflow */
+ static struct timeval tv0 = { 0, 0 };
+
+ if (!tv0.tv_sec)
+ if (gettimeofday(&tv0, NULL) < 0)
+ croak("gettimeofday: %s", SvPV_nolen_const(perl_get_sv("!",TRUE)));
+
+ if (getrusage(0, &ru) < 0)
+ croak("getrusage: %s", SvPV_nolen_const(perl_get_sv("!",TRUE)));
+
+ if (gettimeofday(&tv, NULL) < 0)
+ croak("gettimeofday: %s", SvPV_nolen_const(perl_get_sv("!",TRUE)));
+
+ t->tms_stime = DPROF_HZ * ru.ru_stime.tv_sec + ru.ru_stime.tv_usec;
+ t->tms_utime = DPROF_HZ * ru.ru_utime.tv_sec + ru.ru_utime.tv_usec;
+
+ if (tv.tv_usec < tv0.tv_usec)
+ tv.tv_sec--, tv.tv_usec += DPROF_HZ;
+
+ return DPROF_HZ * (tv.tv_sec - tv0.tv_sec) + tv.tv_usec - tv0.tv_usec;
+# else /* !VMS && !OS2 && !BSD! */
return times(t);
+# endif
# endif
#endif
}
|
From ams@toroid.orgAt 2007-08-02 15:36:42 -0700, perlbug-followup@perl.org wrote:
The patch looks reasonable enough, but the "BSDish" define covers a wide I applied it anyway (#31677), so we can get some testing, but it may not -- ams |
The RT System itself - Status changed from 'new' to 'open' |
p5p@spam.wizbit.be - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#44349 (status was 'resolved')
Searchable as RT44349$
The text was updated successfully, but these errors were encountered: