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.


In reply to Why is this code so much slower than the same algorithm in C? by wanna_code_perl

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.