Skip to content

Commit 80a5909

Browse files
committed
Time::HiRes add TMR_newSVi_u_nv_mortal() fast path macros for newer perls
-sv_2mortal() does alot of checks internally that we don't need, like test for NULL and IMMs, we are trying to write PUSH_EXTEND_MORTAL__SV_C() without actually using that private API from sv.c, but newSV_type_mortal() if it is available has the same optimizations in it as PUSH_EXTEND_MORTAL__SV_C()
1 parent e75eb18 commit 80a5909

File tree

1 file changed

+63
-10
lines changed

1 file changed

+63
-10
lines changed

dist/Time-HiRes/HiRes.xs

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ Addendum: it's "only" 33% speedup.
109109
#define TMR_TARGi(_nsv, i, do_taint) \
110110
STMT_START { \
111111
IV TARGi_iv = i; \
112-
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) \
113-
_nsv = sv_2mortal(newSViv(TARGi_iv)); \
112+
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) { \
113+
TMR_newSViv_mortal(_nsv, TARGi_iv); \
114+
} \
114115
else { \
115116
_nsv = PAD_SV(PL_op->op_targ); \
116117
if (LIKELY( \
@@ -136,8 +137,9 @@ STMT_START { \
136137
#define TMR_TARGu(_nsv, u, do_taint) \
137138
STMT_START { \
138139
UV TARGu_uv = u; \
139-
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) \
140-
_nsv = sv_2mortal(newSVuv(TARGu_uv)); \
140+
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) { \
141+
TMR_newSVuv_mortal(_nsv, TARGu_uv); \
142+
} \
141143
else { \
142144
_nsv = PAD_SV(PL_op->op_targ); \
143145
if (LIKELY( \
@@ -164,8 +166,9 @@ STMT_START { \
164166
#define TMR_TARGn(_nsv, n, do_taint) \
165167
STMT_START { \
166168
NV TARGn_nv = n; \
167-
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) \
168-
_nsv = sv_2mortal(newSVnv(TARGn_nv)); \
169+
if (GIMME_V == G_LIST || !(PL_op->op_private & OPpENTERSUB_HASTARG)) { \
170+
TMR_newSVnv_mortal(_nsv, TARGn_nv); \
171+
} \
169172
else { \
170173
_nsv = PAD_SV(PL_op->op_targ); \
171174
if (LIKELY( \
@@ -185,6 +188,52 @@ STMT_START { \
185188
} \
186189
} STMT_END
187190

191+
192+
/* newSV_type_mortal() is faster than sv_2mortal() */
193+
194+
#ifdef newSV_type_mortal
195+
196+
# define TMR_newSViv_mortal(_nsv, _iv) STMT_START { \
197+
_nsv = newSV_type_mortal(SVt_IV); \
198+
SvIOK_on(_nsv); \
199+
SvIV_set(_nsv, _iv); \
200+
} STMT_END
201+
202+
# define TMR_newSVuv_mortal(_nsv, _uv) STMT_START { \
203+
_nsv = newSV_type_mortal(SVt_IV); \
204+
SvIOK_on(_nsv); \
205+
if (_uv <= (UV)IV_MAX) { \
206+
SvIV_set(_nsv, (IV)_uv); \
207+
} \
208+
else { \
209+
SvIsUV_on(_nsv);\
210+
SvUV_set(_nsv, _uv); \
211+
} \
212+
} STMT_END
213+
214+
# define TMR_newSVnv_mortal(_nsv, _nv) STMT_START { \
215+
_nsv = newSV_type_mortal(SVt_NV); \
216+
SvNV_set(_nsv, _nv); \
217+
SvNOK_on(_nsv); \
218+
} STMT_END
219+
220+
#else
221+
222+
# define TMR_newSViv_mortal(_nsv, _iv) STMT_START { \
223+
_nsv = sv_2mortal(newSViv(_iv)); \
224+
} STMT_END
225+
226+
# define TMR_newSVuv_mortal(_nsv, _uv) STMT_START { \
227+
_nsv = sv_2mortal(newSVuv(_uv)); \
228+
} STMT_END
229+
230+
# define TMR_newSVnv_mortal(_nsv, _nv) STMT_START { \
231+
_nsv = sv_2mortal(newSVnv(_nv)); \
232+
} STMT_END
233+
234+
#endif
235+
236+
188237
#define IV_1E6 1000000
189238
#define IV_1E7 10000000
190239
#define IV_1E9 1000000000
@@ -1724,8 +1773,11 @@ gettimeofday()
17241773
/* copy to registers to prove sv_2mortal/newSViv */
17251774
IV sec = Tp.tv_sec; /* can't modify the values */
17261775
IV usec = Tp.tv_usec;
1727-
PUSHs(sv_2mortal(newSViv(sec)));
1728-
PUSHs(sv_2mortal(newSViv(usec)));
1776+
SV* rsv;
1777+
TMR_newSViv_mortal(rsv, sec);
1778+
PUSHs(rsv);
1779+
TMR_newSViv_mortal(rsv, usec);
1780+
PUSHs(rsv);
17291781
} else {
17301782
/* no Perl_leave_adjust_stacks() hazard here,
17311783
only a PP vs call_sv() hazard */
@@ -1752,8 +1804,9 @@ gettimeofday()
17521804
else
17531805
sv_setnv_mg(rsv, TARGn_nv);
17541806
}
1755-
else
1756-
rsv = sv_2mortal(newSVnv(TARGn_nv));
1807+
else {
1808+
TMR_newSVnv_mortal(rsv, TARGn_nv);
1809+
}
17571810
PUSHs(rsv);
17581811
}
17591812
}

0 commit comments

Comments
 (0)