in reply to latest on ithreads vs forks?

Could you show some code and some more information (like OS and perl version) that shows the results of you benchmark?

I'm not sure that forks.pm is supposed to be faster, but as I recall it was more memory efficient and probably more stable in some cases. Maybe Liz has something to say about this.

Replies are listed 'Best First'.
Re: Re: latest on ithreads vs forks?
by Anonymous Monk on May 26, 2004 at 23:08 UTC
    Sure thing. I'm running on a P4 with Linux 2.4.9. Here's a simple test I tried, using perl 5.8.4:

    # which threading model do we want? use threads; #use forks; $num_threads = shift(@ARGV) || 10; foreach (0..$num_threads-1) { # create a new thread push(@threads,threads->new(\&thread_sub)); } foreach $thread (@threads) { # wait for threads to finish $thread->join(); } printf "Orig thread done\n"; sub thread_sub { printf "Thread %d started\n",threads->tid(); }

    When I run time on a series of runs with threads.pm/forks.pm, I can't tell how much cpu time forks.pm really uses because I only get the cpu time of the parent (working on that), but I the average page faults looks like this:

    threads.pm: Major (requiring I/O) page faults: 387.00 Minor (reclaiming a frame) page faults: 1151.20 forks.pm: Major (requiring I/O) page faults: 470.00 Minor (reclaiming a frame) page faults: 4591.20

    Wall clock time, for what that's worth (these are all run on the same machine), is consistently 4x for forks vs threads.

      Can you try loading up some heavy modules like DBI, HTML::Parser, LWP, and IO::Handle, all before spawning threads, and see what happens? Wall time seems like a reasonable metric to me. Also, you might want to compare memory used.
Re: Re: latest on ithreads vs forks?
by liz (Monsignor) on May 29, 2004 at 09:41 UTC
    Latency in the inter-thread communication in forks is much higher than with threads, as it uses a TCP/IP socket and Storable for it.

    Thread startup, especially if you have a lot of modules loaded, should be faster with forks, as there is no copying of data-structures when a thread is started with forks (it just does a fork()). However, every thread with forks, has a bit of latency at startup, because of the setting of the inter-thread communications socket.

    Hope this explains it a bit.

    Liz