<snip>
> Drieux might provide us with some benchmarks about which one's faster
> these days... ;-)
</snip>
I beat him to it. Interestingly enough, I either have a bug in my code
(and I don't think I do) or xor is dangerous in relation to negative
numbers (without the integer pragma). The results seem to favor xor
except for long strings, but since xor is dangerous for negative doubles
and temp came in a close second or first every time I would suggest the
use of a temporary variable if you are concerned with speed.
<output>
Testing string type swaps
list
a = [this is one] :: b = [this is two]
a = [this is two] :: b = [this is one]
xor
a = [this is one] :: b = [this is two]
a = [this is two] :: b = [this is one]
c_inout
a = [this is one] :: b = [this is two]
a = [this is two] :: b = [this is one]
temp
a = [this is one] :: b = [this is two]
a = [this is two] :: b = [this is one]
Testing integer type swaps
list
a = [123] :: b = [-345]
a = [-345] :: b = [123]
xor
a = [123] :: b = [-345]
a = [4294966951] :: b = [123]
c_inout
a = [123] :: b = [-345]
a = [-345] :: b = [123]
temp
a = [123] :: b = [-345]
a = [-345] :: b = [123]
Testing double type swaps
list
a = [123.345] :: b = [-345.457]
a = [-345.457] :: b = [123.345]
xor
a = [123.345] :: b = [-345.457]
a = [4294966951] :: b = [123]
c_inout
a = [123.345] :: b = [-345.457]
a = [-345.457] :: b = [123.345]
temp
a = [123.345] :: b = [-345.457]
a = [-345.457] :: b = [123.345]
Benchmarking string swaps
Rate list c_inout temp xor
list 241920/s -- -16% -54% -55%
c_inout 287630/s 19% -- -45% -47%
temp 527651/s 118% 83% -- -2%
xor 539312/s 123% 88% 2% --
Benchmarking long_string swaps
Rate list c_inout xor temp
list 177932/s -- -15% -40% -44%
c_inout 208521/s 17% -- -29% -35%
xor 294637/s 66% 41% -- -8%
temp 319670/s 80% 53% 8% --
Benchmarking integer swaps
Rate list c_inout temp xor
list 514623/s -- -13% -40% -41%
c_inout 594074/s 15% -- -31% -32%
temp 863985/s 68% 45% -- -1%
xor 872933/s 70% 47% 1% --
Benchmarking double swaps
Rate list c_inout temp xor
list 508858/s -- -7% -40% -42%
c_inout 549703/s 8% -- -35% -38%
temp 843806/s 66% 54% -- -5%
xor 883833/s 74% 61% 5% --
<output>
<code>
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
use Inline 'C';
my $a;
my $b;
my %sub = (
xor => sub {
$a ^= $b;
$b ^= $a;
$a ^= $b;
},
list => sub {
($a, $b) = ($b, $a);
},
temp => sub {
my $temp = $a;
$a = $b;
$b = $temp;
},
c_inout => sub {
c_inout($a, $b);
}
);
my %run = (
integer => [123, -345],
double => [123.345, -345.457],
string => ["this is one", "this is two"],
long_string => [
"this is the first very long string, and a very long string it is
indead for I remember few strings longer or as long than this one, maybe
way back in aught one the was a string close to this size, but I think
that was just an optical illusion because this string is just way too
freaking huge to be compared with paltry little strings like 'this is
one' or 'this is two' and the like.",
"this is the second very long string, and a very long string it is
indead for I remember few strings longer or as long than this one, maybe
way back in aught one the was a string close to this size, but I think
that was just an optical illusion because this string is just way too
freaking huge to be compared with paltry little strings like 'this is
one' or 'this is two' and the like.",
],
);
foreach my $run (keys %run) {
next if $run eq 'long_string';
print "Testing $run type swaps\n";
foreach my $sub (keys %sub) {
print "\t$sub\n";
($a, $b) = ($run{$run}[0], $run{$run}[1]);
print "\t\ta = [$a] :: b = [$b]\n";
$sub{$sub}->();
print "\t\ta = [$a] :: b = [$b]\n";
}
}
foreach my $run (keys %run) {
print "Benchmarking $run swaps\n";
($a, $b) = ($run{$run}[0], $run{$run}[1]);
my $result = Benchmark::timethese(0, \%sub, 'none');
Benchmark::cmpthese($result);
}
__DATA__
__C__
void c_inout(SV* a, SV* b) {
SV* temp;
temp = sv_mortalcopy(a);
sv_setsv(a, b);
sv_setsv(b, temp);
}
</code>
--
Today is Setting Orange the 59th day of Confusion in the YOLD 3168
Hail Eris!
Missile Address: 33:48:3.521N 84:23:34.786W
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]