summaryrefslogtreecommitdiff
path: root/pp_sys.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2014-03-01 17:40:05 +0100
committerNicholas Clark <nick@ccl4.org>2014-03-01 17:40:05 +0100
commit25983af42cdcf2dc1fea6717dac7aac441b6301d (patch)
tree0a6de9811bcfe84d9a22b8a1cdf53f2fdba55834 /pp_sys.c
parentc79d007613fa174f6f5e1588ca5374f505fc44af (diff)
downloadperl-25983af42cdcf2dc1fea6717dac7aac441b6301d.tar.gz
pp_tms should use a local struct tms, instead of PL_timesbuf.
PL_timesbuf is effectively a vestige of Perl 1, and doesn't actually need to be an interpreter variable. It will be removed early in v5.21.x, but it's a good idea to refactor the code not to use it before then. A local struct tms will be on the C stack, which will be in the CPU's L1 cache, whereas the relevant part of the interpreter struct may well not be in the CPU cache at all. Therefore this change might reduce cache pressure fractionally. A local variable access should also be simpler machine code on most CPU architectures.
Diffstat (limited to 'pp_sys.c')
-rw-r--r--pp_sys.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/pp_sys.c b/pp_sys.c
index 6c4e2c7f63..f1eabba39c 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -4397,20 +4397,23 @@ PP(pp_tms)
#ifdef HAS_TIMES
dVAR;
dSP;
- EXTEND(SP, 4);
-#ifndef VMS
- (void)PerlProc_times(&PL_timesbuf);
+#ifdef VMS
+ /* time.h uses different name for struct tms, though the same data is
+ returned.
+ */
+ struct tbuffer_t timesbuf;
#else
- (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
- /* struct tms, though same data */
- /* is returned. */
+ struct tms timesbuf;
#endif
- mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
+ EXTEND(SP, 4);
+ (void)PerlProc_times(&timesbuf);
+
+ mPUSHn(((NV)timesbuf.tms_utime)/(NV)PL_clocktick);
if (GIMME == G_ARRAY) {
- mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
- mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
- mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
+ mPUSHn(((NV)timesbuf.tms_stime)/(NV)PL_clocktick);
+ mPUSHn(((NV)timesbuf.tms_cutime)/(NV)PL_clocktick);
+ mPUSHn(((NV)timesbuf.tms_cstime)/(NV)PL_clocktick);
}
RETURN;
#else