On Mon, 2003-11-10 at 21:31, Stas Bekman wrote:
Thanks Perrin for this comparison numbers, but I think you didn't provide enough build information. Default build opts vary from release to release and from OS to OS, you really need to show the whole perl -V to make these numbers more useful.
Well, I'm not trying to do an analysis of compiler optimizations here. I built these the way I suspect almost everyone else does: all
defaults. The main point was to see if there has been a degradation in
performance since 5.6.1, since I have been hearing that a lot. The
results show clearly enough to me that there has not been, and they
agree with my previous benchmarks. They also show that if you don't
need threads, it is very easy to build a Perl that performs
significantly better than the one that comes with Red Hat 9, so it's
worth doing if you are thinking about deploying a mod_perl app on Red
Hat 9 and concerned about performance.
Sure, Perrin, I understand your point. My goal is different, I'm not interested in defaults or perls shipped with distros. I'm interested in providing an advisory on how to build perl in such a way so that you will get the best performance.
Though I think it's also compiled with ithreads, whereas all others are without, so it's not a fair comparison across different perl versions.
That was actually the reason I included it: to get a sense of how much ithreads hurt performance. As you say though, the other options might be affecting it as well.
OK, I did an extensive benchmarking, this time using the same stock perl 5.8.1, built in different ways. Here it is:
OK, let's look at the same perl build differently and make comparisons. In the following comparison you will see the performance variations by as much as 50% without even starting to talk about enabling threads or not, removing threads will further improve the performance by some 20% and may be more. I've manually added -V:config_args, without which the benchmark is incomplete.
A) perl-5.008001 (+shrplib, -ithreads, +perlio)
path = /home/stas/perl/5.8.1/bin/perl
cc = cc
optimize = -g
ccflags = -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args = '-des -Dprefix=/home/stas/perl/5.8.1 -Doptimize=-g -Duseshrplib -Dusedevel';
B) perl-5.008001 (+shrplib, +ithreads, +perlio)
path = /home/stas/perl/5.8.1-ithread/bin/perl
cc = cc
optimize = -g
ccflags = -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args = '-des -Dprefix=/home/stas/perl/5.8.1-ithread -Dusethreads -Doptimize=-g -Duseshrplib -Dusedevel';
C) perl-5.008001 (-shrplib, +ithreads, +perlio)
path = /home/stas/perl/5.8.1-ithread-nouseshrplib/bin/perl
cc = cc
optimize = -g
ccflags = -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args = '-des -Dprefix=/home/stas/perl/5.8.1-ithread-nouseshrplib -Dusethreads -Doptimize=-g -Uuseshrplib -Dusedevel';
D) perl-5.008001 (+shrplib, -ithreads, +perlio)
path = /home/stas/perl/5.8.1-nodebug/bin/perl5.8.1
cc = cc
optimize = -O3
ccflags = -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args='-des -Dprefix=/home/stas/perl/5.8.1-nodebug -Duseshrplib -Dusedevel'
E) perl-5.008001 (-shrplib, -ithreads, -perlio)
path = /home/stas/perl/5.8.1-nouseperlio/bin/perl
cc = cc
optimize = -g
ccflags = -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args = '-des -Dprefix=/home/stas/perl/5.8.1-nouseperlio -Doptimize=-g -Uuseperlio -Dusedevel'
F) perl-5.008001 (+shrplib, +ithreads, +perlio)
path = /usr/bin/perl
cc = gcc
optimize = -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro
ccflags = -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
usemymalloc = n
config_args = '-des -Dinc_version_list=5.8.0/i386-linux-thread-multi 5.8.0 5.6.1 5.6.0 -Darchname=i386-linux -Dcc=gcc -Doptimize=-O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr -Dman3ext=3pm -Dcf_by=MandrakeSoft -Dmyhostname=localhost [EMAIL PROTECTED] -Dd_dosuid -Ud_csh -Duseshrplib -Dusethreads'
libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so
A B C D E F ---- ---- ---- ---- ---- ---- arith/mixed 100 59 96 108 107 132 arith/trig 100 108 123 152 133 174 array/copy 100 100 113 121 107 122 array/foreach 100 76 110 131 130 157 array/index 100 68 111 136 127 146 array/pop 100 88 104 133 113 125 array/shift 100 82 99 132 112 122 array/sort-num 100 71 78 135 109 96 array/sort 100 77 86 117 112 103 call/0arg 100 94 112 124 118 149 call/1arg 100 100 108 127 129 149 call/2arg 100 98 105 131 121 146 call/9arg 100 99 122 147 136 164 call/empty 100 87 115 132 118 150 call/fib 100 104 116 133 125 152 call/method 100 85 111 78 97 159 call/wantarray 100 84 122 133 131 152 hash/copy 100 98 117 123 124 139 hash/each 100 96 132 122 123 144 hash/foreach-sort 100 89 112 120 116 143 hash/foreach 100 92 124 137 129 165 hash/get 100 68 69 118 119 115 hash/set 100 101 87 141 137 172 loop/for-c 100 87 111 118 126 158 loop/for-range-const 100 77 98 106 83 126 loop/for-range 100 71 102 121 116 133 loop/getline 100 92 115 146 56 156 loop/while-my 100 57 90 99 126 150 loop/while 100 94 114 124 127 148 re/const 100 96 106 179 117 155 re/w 100 84 83 100 113 121 startup/fewmod 100 78 96 124 112 112 startup/lotsofsub 100 73 97 134 122 111 startup/noprog 100 79 102 101 136 80 string/base64 100 98 112 137 126 148 string/htmlparser 100 85 113 129 126 127 string/index-const 100 73 112 146 122 155 string/index-var 100 79 91 126 112 155 string/ipol 100 82 119 116 127 131 string/tr 100 101 111 165 89 164
AVERAGE 100 86 106 128 118 140
So using the average numbers and the major config options I've done a new table sorted from the best performance to the worst.
F (+shrplib, +ithreads, +perlio, -debug) 140 D (+shrplib, -ithreads, +perlio, -debug) 128 E (-shrplib, -ithreads, -perlio, +debug) 118 C (-shrplib, +ithreads, +perlio, +debug) 106 A (+shrplib, -ithreads, +perlio, +debug) 100 B (+shrplib, +ithreads, +perlio, +debug) 86
Conclusions:
1)
F (+shrplib, +ithreads, +perlio, -debug) 140 B (+shrplib, +ithreads, +perlio, +debug) 86
B and F are almost exact the same perl builds (+perlio, +threads, +shrplib). The major difference is that F is built with optimizations '-O2 -fomit-frame-pointer -pipe -march=i586', whereas B is compiled with -DDEBUGGING + -g, which takes the performance down by more than 50% for B! F is Mandrake 9.2 stock Perl.
2)
D (+shrplib, -ithreads, +perlio, -debug) 128 A (+shrplib, -ithreads, +perlio, +debug) 100
D and A are the same builds, and similar to B&F the only difference is debugging enabled in A. As you can see with ithreads disabled enabled debugging affects the performance much less. Still it clearly shows that you don't want the debugging enabled on your production perl.
What puzzles me greatly is that why F w/ ithreads outperforms D w/o ithreads. Go figure. I'm starting to be suspicios of making hard conclusions from running perlbench. The only possible reason I can think of is that:
F: -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro D: -O2 -finline-functions, -fweb, -funit-at-a-time, -ftracer, -funswitch-loops and -frename-registers
F has better a better choice of optimizations. (D has -03 and I have expanded it according to the gcc manpage), e.g., D doesn't use the -mcpu optimization, which may be the crucial factor.
3) I guess I needed quite a few more builds to tell exactly how much enabling each of shrplib, ithreads, perlio affects performance, but you can clearly see that enabling the three of them, brings the performance down by about 30%. Though you can't build ithreads without perlio.
At the moment it looks like if you build your perl with -Uuseshrplib -Uusethreads and don't enable debugging, and use a good selection of optimization flags (like Mandrake 9.2's perl does), you will get the best performance.
__________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com
-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html