aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels van Dijke <perlboy@cpan.org>2022-11-21 12:40:00 +0000
committerNiels van Dijke <perlboy@cpan.org>2022-11-21 12:40:00 +0000
commit9d1c9ef1077c6d54721eb76604d310522439c97f (patch)
tree6061718bf5cdcc3778b279c0304d80ed765f8b9b
parent93e16aedac1f6a51b5227a3510ef3cb125b2ff75 (diff)
downloadperlweeklychallenge-club-9d1c9ef1077c6d54721eb76604d310522439c97f.tar.gz
perlweeklychallenge-club-9d1c9ef1077c6d54721eb76604d310522439c97f.tar.bz2
perlweeklychallenge-club-9d1c9ef1077c6d54721eb76604d310522439c97f.zip
Add Inline 'C' implemenaion (FAST!)
-rwxr-xr-xchallenge-192/perlboy1967/perl/ch-1.pl25
1 files changed, 24 insertions, 1 deletions
diff --git a/challenge-192/perlboy1967/perl/ch-1.pl b/challenge-192/perlboy1967/perl/ch-1.pl
index f3c1f5abbf..f40a39c3a1 100755
--- a/challenge-192/perlboy1967/perl/ch-1.pl
+++ b/challenge-192/perlboy1967/perl/ch-1.pl
@@ -21,6 +21,7 @@ use warnings;
use Test::More;
use Benchmark qw(:all);
+use Inline 'C';
sub binaryFlipString ($) {
@@ -51,9 +52,31 @@ is(binaryFlipBinary(4),3);
is(binaryFlipBinary(6),1);
is(binaryFlipBinary(0b10101),0b1010);
+is(binaryFlipC(5),2);
+is(binaryFlipC(5),2);
+is(binaryFlipC(4),3);
+is(binaryFlipC(6),1);
+is(binaryFlipC(0b10101),0b1010);
done_testing;
-cmpthese(1_000_000, {
+cmpthese(5_000_000, {
'Binary' => sub{binaryFlipBinary(12345678)},
+ 'BinaryC' => sub{binaryFlipC(12345678)},
'String' => sub{binaryFlipString(12345678)},
});
+
+__END__
+__C__
+
+int binaryFlipC (int i) {
+ int j = i;
+ int m = 0;
+
+ while (j) {
+ j >>= 1;
+ m <<= 1;
+ m++;
+ }
+
+ return ~i & m;
+}