I am not sure, if this works as you expect... maybe the
macros and wrappers generate a copy under the hood?
use Inline C;
use strict;
use warnings;
my $x = "012\xf0ABC\x0f\x00\x01\xff";
print unpack("H*", $x ), "\n"; # 303132f04142430f0001ff
flipbits( $x, length $x );
print unpack("H*", $x ), "\n"; # cfcecd0fbebdbcf0fffe00
__END__
__C__
void flipbits(char* a, int len ) {
for ( ; len-- ; ++a ) *a ^= 0xff;
}
Update: Switching to 32bit blocks gave a huge improvement on my 32bit setup...
void flipbits32(char* a, int len ) {
int blocks = len >> 2;
if ( sizeof blocks == 4 ) { /* try 32bit blocks */
for ( ; blocks-- ; a += 4 ) *( (unsigned int*) a ) ^= 0xffffffffU
+;
/* TODO: add treatment for last 1..3 bytes if len is not a multipl
+e of 4 */
} else { /* fallback to 8bit */
for ( ; len-- ; ++a ) *a ^= 0xff;
}
}
Benchmark:
Rate str inline inline32
str 69.1/s -- -37% -69%
flipbits 110/s 59% -- -51%
flipbits32 223/s 222% 103% --
Potential next steps which are also less general, but that's the price to pay:
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.