Skip to content

Commit 02c65aa

Browse files
committed
Time::HiRes move @EXPORT_OK init to XS save disk and mem (SVPV HEK* COW)
-EU::Constant already has all these AUTOLOAD macro const C strings in the binary, and they aren't going away any time soon. So use those C strings to make SVPV HEK* COWs, and stick them in @EXPORT_OK, instead of @EXPORT_OK holding SVPV Newx() non-COW strings. Besides, most or all all of these C strings will become HV* stash HEs, CV*s, or GV*s, and all of those hold PL_strtab HEK*s, so lets same private bytes phy/virtual memory of a Perl proc at runtime b/c @EXPORT_OK's SV*s are all COWs. And speed up Time::HiRes initial load time since yylex/ck_op*() doesn't have to parse, alloc OPs, alloc pad consts, then run BEGIN, then DTOR all the OPs and pad consts.
1 parent 583ccfe commit 02c65aa

File tree

4 files changed

+158
-42
lines changed

4 files changed

+158
-42
lines changed

dist/Time-HiRes/HiRes.pm

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,9 @@ use XSLoader ();
99
our @ISA = qw(Exporter);
1010

1111
our @EXPORT = qw( );
12-
# More or less this same list is in Makefile.PL. Should unify.
13-
our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
14-
getitimer setitimer nanosleep clock_gettime clock_getres
15-
clock clock_nanosleep
16-
CLOCKS_PER_SEC
17-
CLOCK_BOOTTIME
18-
CLOCK_HIGHRES
19-
CLOCK_MONOTONIC
20-
CLOCK_MONOTONIC_COARSE
21-
CLOCK_MONOTONIC_FAST
22-
CLOCK_MONOTONIC_PRECISE
23-
CLOCK_MONOTONIC_RAW
24-
CLOCK_PROCESS_CPUTIME_ID
25-
CLOCK_PROF
26-
CLOCK_REALTIME
27-
CLOCK_REALTIME_COARSE
28-
CLOCK_REALTIME_FAST
29-
CLOCK_REALTIME_PRECISE
30-
CLOCK_REALTIME_RAW
31-
CLOCK_SECOND
32-
CLOCK_SOFTTIME
33-
CLOCK_THREAD_CPUTIME_ID
34-
CLOCK_TIMEOFDAY
35-
CLOCK_UPTIME
36-
CLOCK_UPTIME_COARSE
37-
CLOCK_UPTIME_FAST
38-
CLOCK_UPTIME_PRECISE
39-
CLOCK_UPTIME_RAW
40-
CLOCK_VIRTUAL
41-
ITIMER_PROF
42-
ITIMER_REAL
43-
ITIMER_REALPROF
44-
ITIMER_VIRTUAL
45-
TIMER_ABSTIME
46-
d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
47-
d_nanosleep d_clock_gettime d_clock_getres
48-
d_clock d_clock_nanosleep d_hires_stat
49-
d_futimens d_utimensat d_hires_utime
50-
stat lstat utime
51-
);
12+
# More or less this same list is in Makefile.PL. Should unify. It is filled
13+
# in by ::bootstrap(). Check t/clock.t for the definition.
14+
our @EXPORT_OK;
5215

5316
our $VERSION = '1.9779';
5417
our $XS_VERSION = $VERSION;
@@ -90,7 +53,7 @@ sub import {
9053
goto &Exporter::import;
9154
}
9255

93-
XSLoader::load( 'Time::HiRes', $XS_VERSION );
56+
XSLoader::load( 'Time::HiRes', $XS_VERSION, \@EXPORT_OK );
9457

9558
# Preloaded methods go here.
9659

dist/Time-HiRes/HiRes.xs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,8 @@ PROTOTYPES: ENABLE
12121212

12131213
BOOT:
12141214
{
1215+
if (items != 3)
1216+
croak_xs_usage(cv,"cls,ver,exok");
12151217
#ifdef MY_CXT_KEY
12161218
MY_CXT_INIT;
12171219
#endif
@@ -1293,6 +1295,106 @@ BOOT:
12931295
MUTEX_INIT(&darwin_time_mutex);
12941296
# endif
12951297
#endif
1298+
#if defined(HAS_GETITIMER) && defined(HAS_SETITIMER)
1299+
# define GETITIMER_SUBSTR "Time::HiRes::getitimer"+13
1300+
# define SETITIMER_SUBSTR "Time::HiRes::setitimer"+13
1301+
#else
1302+
# define GETITIMER_SUBSTR "d_getitimer"+2
1303+
# define SETITIMER_SUBSTR "d_setitimer"+2
1304+
#endif
1305+
#define INIT1 INIT2(sym_usleep, "Time::HiRes::usleep"+13, sizeof("usleep")-1, NULL, 0) \
1306+
INIT2(sym_sleep, "Time::HiRes::sleep"+13, sizeof("sleep")-1, NULL, 0) \
1307+
INIT2(sym_ualarm, "Time::HiRes::ualarm"+13, sizeof("ualarm")-1, NULL, 0) \
1308+
INIT2(sym_alarm, "Time::HiRes::alarm"+13, sizeof("alarm")-1, NULL, 0) \
1309+
INIT2(sym_gettimeofday, "Time::HiRes::gettimeofday"+13, sizeof("gettimeofday")-1, NULL, 0) \
1310+
INIT2(sym_time, "Time::HiRes::time"+13, sizeof("time")-1, NULL, 0) \
1311+
INIT2(sym_tv_interval, "tv_interval", sizeof("tv_interval")-1, NULL, 0) \
1312+
INIT2(sym_getitimer, GETITIMER_SUBSTR, sizeof("getitimer")-1, NULL, 0) \
1313+
INIT2(sym_setitimer, SETITIMER_SUBSTR, sizeof("setitimer")-1, NULL, 0) \
1314+
INIT2(sym_nanosleep, "Time::HiRes::nanosleep"+13, sizeof("nanosleep")-1, NULL, 0) \
1315+
INIT2(sym_clock_gettime, "Time::HiRes::clock_gettime"+13, sizeof("clock_gettime")-1, NULL, 0) \
1316+
INIT2(sym_clock_getres, "Time::HiRes::clock_getres"+13, sizeof("clock_getres")-1, NULL, 0) \
1317+
INIT2(sym_clock, "Time::HiRes::clock"+13, sizeof("clock")-1, NULL, 0) \
1318+
INIT2(sym_clock_nanosleep, "Time::HiRes::clock_nanosleep"+13, sizeof("clock_nanosleep")-1, NULL, 0) \
1319+
INIT2(sym_CLOCKS_PER_SEC, "CLOCKS_PER_SEC", sizeof("CLOCKS_PER_SEC")-1, NULL, 0) \
1320+
INIT2(sym_CLOCK_BOOTTIME, "CLOCK_BOOTTIME", sizeof("CLOCK_BOOTTIME")-1, NULL, 0) \
1321+
INIT2(sym_CLOCK_HIGHRES, "CLOCK_HIGHRES", sizeof("CLOCK_HIGHRES")-1, NULL, 0) \
1322+
INIT2(sym_CLOCK_MONOTONIC, "CLOCK_MONOTONIC", sizeof("CLOCK_MONOTONIC")-1, NULL, 0) \
1323+
INIT2(sym_CLOCK_MONOTONIC_COARSE, "CLOCK_MONOTONIC_COARSE", sizeof("CLOCK_MONOTONIC_COARSE")-1, NULL, 0) \
1324+
INIT2(sym_CLOCK_MONOTONIC_FAST, "CLOCK_MONOTONIC_FAST", sizeof("CLOCK_MONOTONIC_FAST")-1, NULL, 0) \
1325+
INIT2(sym_CLOCK_MONOTONIC_PRECISE, "CLOCK_MONOTONIC_PRECISE", sizeof("CLOCK_MONOTONIC_PRECISE")-1, NULL, 0) \
1326+
INIT2(sym_CLOCK_MONOTONIC_RAW, "CLOCK_MONOTONIC_RAW", sizeof("CLOCK_MONOTONIC_RAW")-1, NULL, 0) \
1327+
INIT2(sym_CLOCK_PROCESS_CPUTIME_ID, "CLOCK_PROCESS_CPUTIME_ID", sizeof("CLOCK_PROCESS_CPUTIME_ID")-1, NULL, 0) \
1328+
INIT2(sym_CLOCK_PROF, "CLOCK_PROF", sizeof("CLOCK_PROF")-1, NULL, 0) \
1329+
INIT2(sym_CLOCK_REALTIME, "CLOCK_REALTIME", sizeof("CLOCK_REALTIME")-1, NULL, 0) \
1330+
INIT2(sym_CLOCK_REALTIME_COARSE, "CLOCK_REALTIME_COARSE", sizeof("CLOCK_REALTIME_COARSE")-1, NULL, 0) \
1331+
INIT2(sym_CLOCK_REALTIME_FAST, "CLOCK_REALTIME_FAST", sizeof("CLOCK_REALTIME_FAST")-1, NULL, 0) \
1332+
INIT2(sym_CLOCK_REALTIME_PRECISE, "CLOCK_REALTIME_PRECISE", sizeof("CLOCK_REALTIME_PRECISE")-1, NULL, 0) \
1333+
INIT2(sym_CLOCK_REALTIME_RAW, "CLOCK_REALTIME_RAW", sizeof("CLOCK_REALTIME_RAW")-1, NULL, 0) \
1334+
INIT2(sym_CLOCK_SECOND, "CLOCK_SECOND", sizeof("CLOCK_SECOND")-1, NULL, 0) \
1335+
INIT2(sym_CLOCK_SOFTTIME, "CLOCK_SOFTTIME", sizeof("CLOCK_SOFTTIME")-1, NULL, 0) \
1336+
INIT2(sym_CLOCK_THREAD_CPUTIME_ID, "CLOCK_THREAD_CPUTIME_ID", sizeof("CLOCK_THREAD_CPUTIME_ID")-1, NULL, 0) \
1337+
INIT2(sym_CLOCK_TIMEOFDAY, "CLOCK_TIMEOFDAY", sizeof("CLOCK_TIMEOFDAY")-1, NULL, 0) \
1338+
INIT2(sym_CLOCK_UPTIME, "CLOCK_UPTIME", sizeof("CLOCK_UPTIME")-1, NULL, 0) \
1339+
INIT2(sym_CLOCK_UPTIME_COARSE, "CLOCK_UPTIME_COARSE", sizeof("CLOCK_UPTIME_COARSE")-1, NULL, 0) \
1340+
INIT2(sym_CLOCK_UPTIME_FAST, "CLOCK_UPTIME_FAST", sizeof("CLOCK_UPTIME_FAST")-1, NULL, 0) \
1341+
INIT2(sym_CLOCK_UPTIME_PRECISE, "CLOCK_UPTIME_PRECISE", sizeof("CLOCK_UPTIME_PRECISE")-1, NULL, 0) \
1342+
INIT2(sym_CLOCK_UPTIME_RAW, "CLOCK_UPTIME_RAW", sizeof("CLOCK_UPTIME_RAW")-1, NULL, 0) \
1343+
INIT2(sym_CLOCK_VIRTUAL, "CLOCK_VIRTUAL", sizeof("CLOCK_VIRTUAL")-1, NULL, 0) \
1344+
INIT2(sym_ITIMER_PROF, "ITIMER_PROF", sizeof("ITIMER_PROF")-1, NULL, 0) \
1345+
INIT2(sym_ITIMER_REAL, "ITIMER_REAL", sizeof("ITIMER_REAL")-1, NULL, 0) \
1346+
INIT2(sym_ITIMER_REALPROF, "ITIMER_REALPROF", sizeof("ITIMER_REALPROF")-1, NULL, 0) \
1347+
INIT2(sym_ITIMER_VIRTUAL, "ITIMER_VIRTUAL", sizeof("ITIMER_VIRTUAL")-1, NULL, 0) \
1348+
INIT2(sym_TIMER_ABSTIME, "TIMER_ABSTIME", sizeof("TIMER_ABSTIME")-1, NULL, 0) \
1349+
INIT2(sym_d_usleep, "d_usleep", sizeof("d_usleep")-1, "Time::HiRes::usleep"+13, 1) \
1350+
INIT2(sym_d_ualarm, "d_ualarm", sizeof("d_ualarm")-1, "Time::HiRes::ualarm"+13, 1) \
1351+
INIT2(sym_d_gettimeofday, "d_gettimeofday", sizeof("d_gettimeofday")-1, "Time::HiRes::gettimeofday"+13, 1) \
1352+
INIT2(sym_d_getitimer, "d_getitimer", sizeof("d_getitimer")-1, GETITIMER_SUBSTR, 1) \
1353+
INIT2(sym_d_setitimer, "d_setitimer", sizeof("d_setitimer")-1, SETITIMER_SUBSTR, 1) \
1354+
INIT2(sym_d_nanosleep, "d_nanosleep", sizeof("d_nanosleep")-1, "Time::HiRes::nanosleep"+13, 1) \
1355+
INIT2(sym_d_clock_gettime, "d_clock_gettime", sizeof("d_clock_gettime")-1, "Time::HiRes::clock_gettime"+13, 1) \
1356+
INIT2(sym_d_clock_getres, "d_clock_getres", sizeof("d_clock_getres")-1, "Time::HiRes::clock_getres"+13, 1) \
1357+
INIT2(sym_d_clock, "d_clock", sizeof("d_clock")-1, "Time::HiRes::clock"+13, 1) \
1358+
INIT2(sym_d_clock_nanosleep, "d_clock_nanosleep", sizeof("d_clock_nanosleep")-1, "Time::HiRes::clock_nanosleep"+13, 1) \
1359+
INIT2(sym_d_hires_stat, "d_hires_stat", sizeof("d_hires_stat")-1, NULL, 0) \
1360+
INIT2(sym_d_futimens, "d_futimens", sizeof("d_futimens")-1, "futimens", 1) \
1361+
INIT2(sym_d_utimensat, "d_utimensat", sizeof("d_utimensat")-1, "utimensat", 1) \
1362+
INIT2(sym_d_hires_utime, "d_hires_utime", sizeof("d_hires_utime")-1, NULL, 0) \
1363+
INIT2(sym_stat, "Time::HiRes::stat"+13, sizeof("stat")-1, NULL, 0) \
1364+
INIT2(sym_lstat, "Time::HiRes::lstat"+13, sizeof("lstat")-1, NULL, 0) \
1365+
INIT2(sym_utime, "Time::HiRes::utime"+13, sizeof("utime")-1, NULL, 0)
1366+
#undef INIT2
1367+
#define INIT2(_s, _str, _l, _d, _db) ((_db) ? (_d) : (_str)),
1368+
{
1369+
const static char * expokpv[] = {
1370+
INIT1
1371+
};
1372+
#undef INIT2
1373+
#define INIT2(_s, _str, _l, _d, _db) ((_db) ? -((I8)(_l)) : (_l)),
1374+
const static I8 expoklen[] = {
1375+
INIT1
1376+
};
1377+
#undef INIT2
1378+
char buf [64];
1379+
SV* rv = ST(2);/* 3 items check above */
1380+
AV* av = MUTABLE_AV(SvRV(rv));
1381+
int i = 0;
1382+
buf[0] = 'd';
1383+
buf[1] = '_';
1384+
if( !SvROK(rv) || SvTYPE(av) != SVt_PVAV)
1385+
croak_xs_usage(cv,"cls,ver,expok");
1386+
av_extend(av, C_ARRAY_LENGTH(expoklen));
1387+
for(;i < C_ARRAY_LENGTH(expoklen); i++) {
1388+
I8 l = expoklen[i];
1389+
const char * pv = expokpv[i];
1390+
if (l < 0) {
1391+
l = -l;
1392+
Copy(pv, &buf[2], (l+1)-2, char);
1393+
pv = buf;
1394+
}
1395+
av_push(av, newSVpvn_share(pv, l, 0));
1396+
}
1397+
}
12961398
}
12971399

12981400
#if defined(USE_ITHREADS) && defined(MY_CXT_KEY)

dist/Time-HiRes/Makefile.PL

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,14 @@ sub doConstants {
10151015
push @names, {name => $_, macro => $macro, value => 1,
10161016
default => ["IV", "0"]};
10171017
}
1018+
{
1019+
#disarm chopping off first or last letter of each C string for memEQs()
1020+
my $sub = \&ExtUtils::Constant::Base::memEQ_clause;
1021+
*ExtUtils::Constant::Base::memEQ_clause = sub {
1022+
$_[1]->{checked_at} = 32;
1023+
return $sub->(@_);
1024+
};
1025+
}
10181026
ExtUtils::Constant::WriteConstants(
10191027
NAME => 'Time::HiRes',
10201028
NAMES => \@names,

dist/Time-HiRes/t/clock.t

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,54 @@
11
use strict;
22

3-
use Test::More tests => 5;
3+
use Test::More tests => 6;
44
BEGIN { push @INC, '.' }
55
use t::Watchdog;
66

77
BEGIN { require_ok "Time::HiRes"; }
88

9+
10+
my @EXPORT_OK_valid = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
11+
getitimer setitimer nanosleep clock_gettime clock_getres
12+
clock clock_nanosleep
13+
CLOCKS_PER_SEC
14+
CLOCK_BOOTTIME
15+
CLOCK_HIGHRES
16+
CLOCK_MONOTONIC
17+
CLOCK_MONOTONIC_COARSE
18+
CLOCK_MONOTONIC_FAST
19+
CLOCK_MONOTONIC_PRECISE
20+
CLOCK_MONOTONIC_RAW
21+
CLOCK_PROCESS_CPUTIME_ID
22+
CLOCK_PROF
23+
CLOCK_REALTIME
24+
CLOCK_REALTIME_COARSE
25+
CLOCK_REALTIME_FAST
26+
CLOCK_REALTIME_PRECISE
27+
CLOCK_REALTIME_RAW
28+
CLOCK_SECOND
29+
CLOCK_SOFTTIME
30+
CLOCK_THREAD_CPUTIME_ID
31+
CLOCK_TIMEOFDAY
32+
CLOCK_UPTIME
33+
CLOCK_UPTIME_COARSE
34+
CLOCK_UPTIME_FAST
35+
CLOCK_UPTIME_PRECISE
36+
CLOCK_UPTIME_RAW
37+
CLOCK_VIRTUAL
38+
ITIMER_PROF
39+
ITIMER_REAL
40+
ITIMER_REALPROF
41+
ITIMER_VIRTUAL
42+
TIMER_ABSTIME
43+
d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
44+
d_nanosleep d_clock_gettime d_clock_getres
45+
d_clock d_clock_nanosleep d_hires_stat
46+
d_futimens d_utimensat d_hires_utime
47+
stat lstat utime
48+
);
49+
50+
is_deeply(\@Time::HiRes::EXPORT_OK, \@EXPORT_OK_valid, '@Time::HiRes::EXPORT_OK has correct strings');
51+
952
sub has_symbol {
1053
my $symbol = shift;
1154
eval "use Time::HiRes qw($symbol)";

0 commit comments

Comments
 (0)