VO
Size: a a a
VO
AP
tr 504/s 8713% 4524% 3362% -- -46%
inlinec 931/s 16186% 8445% 6298% 85% --
AP
use Inline C => <<'END_OF_C_CODE';
#define haszero(v) (((v) - 0x01010101UL) & ~(v) & 0x80808080UL)
#define hasvalue(x,n) (haszero((x) ^ (~0UL/255 * (n))))
SV* lines_in_string(SV* sv) {
int i, lines = 0;
STRLEN len;
char *ptr;
ptr = SvPV(sv, len);
if(len > 0) {
for(i = 0; i + 4 <= len; i += 4) {
int v = *(int*)(ptr + i);
if(hasvalue(v,'\n')) ++lines;
}
for(; i < len; ++i) {
if(ptr[i] == '\n') ++lines;
}
if(ptr[len - 1] != '\n') ++lines;
}
return newSViv(lines);
}
END_OF_C_CODE
AP
1048576
AP
AP
AP
AP
AP
AP
tr 206/s 10586% 5603% 4010% -- -11%
inlinec 230/s 11846% 6275% 4495% 12% --
AP
my $str = "ab\nc\ndefg\n" x 1048576;
SZ
AP
SZ
AP
AP
AP
VG