#45942 [Com]: D_FILE_OFFSET_BITS=64 causes PHP to run at half speed
ID: 45942
Comment by: jhuckaby at gmail dot com
Reported By: jhuckaby at gmail dot com
Status: Open
Bug Type: Performance problem
Operating System: Fedora Core 6
PHP Version: 5.2.6
New Comment:
Wait, I spoke too soon! Please don't close the bug yet. As soon as I
removed the "--disable-all --disable-cgi" ./configure command-line
options, I got this build error from the "make" step:
/home/jhuckaby/dev/3rdparty/source/apache-1.3/php-
5.2.7/ext/posix/posix.c: In function 'zif_posix_uname':
/home/jhuckaby/dev/3rdparty/source/apache-1.3/php-
5.2.7/ext/posix/posix.c:471: error: 'struct utsname' has no member
named 'domainname'
make: *** [ext/posix/posix.lo] Error 1
I didn't add any new command-line options, I simply removed the "--
disable-all --disable-cgi".
./configure --with-apache=../apache_1.3.39 --prefix=/ipix/php --with-
config-file-path=/ipix/php/lib --disable-all --disable-cgi
Any ideas?
Should I file this under a separate bug?
Previous Comments:
------------------------------------------------------------------------
[2008-08-29 20:28:04] jhuckaby at gmail dot com
Okay, I followed your instructions. I added AC_SYS_LARGEFILE to
configure.in, then ran ./buildconf --force. Then I followed with
./configure..., make, and make install. I found the following output
from ./configure of interest:
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... unknown
checking for _LARGE_FILES value needed for large files... unknown
Anyway, it compiled clean and installed. And it seems to work
correctly, writing >2GB large files without error AND the interpreter
speed is fast! Thanks!
[root@dev-ops php-5.2.6]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 310
[root@dev-ops php-5.2.6]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 311
[root@dev-ops php-5.2.6]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 312
[root@dev-ops php-5.2.6]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 306
[root@dev-ops php-5.2.6]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 311
I guess we can close this bug!
------------------------------------------------------------------------
[2008-08-29 19:03:20] crrodriguez at suse dot de
You dont pass D_FILE_OFFSET_BITS=64 directly, but add
AC_SYS_LARGEFILE
to configure.in then run ./buildconf --force and rebuild PHP.
BTW.. it is known that large file support may not work currenlty with
PHP.
------------------------------------------------------------------------
[2008-08-28 21:20:42] jhuckaby at gmail dot com
Good idea.
CFLAGS="-D_FILE_OFFSET_BITS=64" ./configure --disable-all --disable-
cgi --with-apache=../apache_1.3.39 --prefix=/ipix/php --with-config-
file-path=/ipix/php/lib
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 157
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 157
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 156
./configure --disable-all --disable-cgi --with-apache=../apache_1.3.39
--prefix=/ipix/php --with-config-file-path=/ipix/php/lib
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 285
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 293
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 289
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 298
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 287
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 293
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 286
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 289
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 298
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 285
Still almost twice as fast when I remove the D_FILE_OFFSET_BITS flag.
------------------------------------------------------------------------
[2008-08-28 21:07:19] jani@php.net
Try without any other stuff included, using --disable-all --disable-cgi
as only configure options. And run that script at least 10 times in a
row..
------------------------------------------------------------------------
[2008-08-28 17:36:37] jhuckaby at gmail dot com
Description:
------------
Compiling PHP with -D_FILE_OFFSET_BITS=64 causes the PHP interpreter
to run at approximately half speed. This includes basic math
operations (no file reading/writing necessary to reproduce).
Output from script with PHP 5.2.6 compiled with the default 32 bit
file offsets:
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 319
Output from script with PHP 5.2.6 compiled with -
D_FILE_OFFSET_BITS=64:
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 153
Please note this number represents the number of iterations through
the loop in 1 second of runtime, so larger numbers are faster.
I have reproduced the same behavior with the bleeding edge CVS daily
snapshot (php5.2-200808281630) and latest 5.2.6 stable, as well as
5.2.4 stable.
My ./configure line:
CFLAGS="-D_FILE_OFFSET_BITS=64" ./configure --with-pgsql=/ipix/pgsql -
-enable-ftp --with-zlib --enable-shmop --enable-sysvsem --enable-
sysvshm --enable-sysvmsg --enable-pcntl --enable-mbstring --with-xsl -
-with-curl --with-curlwrappers --without-mysql --with-ldap --with-
ldap-sasl --with-apache=../apache_1.3.39 --prefix=/ipix/php --with-
config-file-path=/ipix/php/lib
Simply removing the CFLAGS="-D_FILE_OFFSET_BITS=64" doubles the speed
of the test script.
Reproduce code:
---------------
<?php
$start_time = microtime(true);
$done = 0;
$count = 0;
while (!$done) {
for ($idx = 0; $idx < 10000; $idx++) {
$x = 45 * 67 / 2 + $idx - 239892382.23232323;
$y = 3483434.33483 / 28328372 * 384 + $idx - $x;
}
$count++;
$now = microtime(true);
if ($now - $start_time >= 1.0) { $done = 1; }
}
print "CPU Benchmark: $count\n";
?>
Expected result:
----------------
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 319
The output of the script should be nearly identical whether the
D_FILE_OFFSET_BITS is set to 64 or not.
The benchmark number is the number of iterations through the loop that
was achieved in 1 second of runtime, so larger numbers are faster.
Actual result:
--------------
[root@dev-ops buildscripts]# /ipix/php/bin/php ~/benchmark.php
CPU Benchmark: 153
(This is about half the speed it should be -- larger numbers are
better,
as this is a count of the iterations for one second of runtime.)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=45942&edit=1
Thread (9 messages)