Hello Monks,
I am trying to figure out why this code performs so poorly against its C counterpart:
Perl (complete program)
#!/usr/bin/perl OUTER: for (my $i = 20; ; $i += 20) { foreach (my $j = 1; $j < 20; $j++) { next OUTER if ($i % $j); } print "Number: $i\n"; last; }
C (complete program)
#include <stdio.h> int main(void) { int i, j; for (i = 20; ; i += 20) { for (j = 1; j < 20; j++) { if (i % j) break; } if (j == 20) { printf("Number: %d\n", i); break; } } return 0; }
On my machine, the C variant (Linux GCC 4.3.2, no optimization flags, not stripped) runs in 1.36 +/- 0.02 user+system seconds.
The Perl variant (5.10.0) takes 48.7 user+system seconds on the same machine.
Why is Perl so much slower at running the same algorithm? (Actually the C algorithm is slightly worse due to the extra comparison).
Keep in mind, the purpose of the code samples is completely tangential to this discussion--I am seeing similar performance with all tight processing loops. I am aware of the ability to use native C libraries with Perl (and other optimization techniques), but my question is not about optimization. I just want to get a better idea of what is making Perl so terribly slow with simple loops like the above.
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |