ID: 32806
Updated by: [EMAIL PROTECTED]
Reported By: peoned at yahoo dot com
-Status: Open
+Status: Bogus
Bug Type: Performance problem
Operating System: Linux
PHP Version: 5.0.4
New Comment:
Startup costs could be 8 seconds or more depending on the extensions
you are loading. That said PHP's fgets() is still slower then Perl's
because of it's implementation that does not wrap the C library fgets()
or getline(), but rather uses custom code.
Previous Comments:
------------------------------------------------------------------------
[2005-04-24 20:20:54] peoned at yahoo dot com
I don't agree that this is a bogus bug. You want to tell me that the
start up cost is responsible for 8 seconds? Than you have a performance
bug with your start up cost. Run it with fread($fin, 1024); where did
the start up cost go? Simplifying the script to while($line =
fgets($fin)){} doesn't help either. And automatic detection of new
lines is disabled. Did you run some of your own tests?
------------------------------------------------------------------------
[2005-04-24 18:25:52] [EMAIL PROTECTED]
Performance is equivalent when you simplify your PHP script and stop
timing php's start-up costs. Also make sure that automatic detection of
new lines is disabled.
------------------------------------------------------------------------
[2005-04-24 00:13:01] peoned at yahoo dot com
Perl code:
#!/usr/local/bin/perl
open(IN, "<afe199406");
open(OUT, ">perl_out.txt");
while(<IN>)
{
print OUT $_;
}
close(OUT);
close(IN);
C code:
#include <stdio.h>
#include <string.h>
int main(void)
{
size_t n = 5000;
char *ptr;
FILE *fp;
FILE *fi;
fp = fopen("int.txt", "rb");
fi = fopen("out.txt", "wb");
ptr = (char *)malloc(5000);
int i=0;
while(getline(&ptr,&n,fp) != -1)
{
fwrite(ptr, 1, strlen(ptr), fi);
}
free(ptr);
fclose(fp);
fclose(fi);
}
magic_quotes_runtime was off
------------------------------------------------------------------------
[2005-04-23 23:59:51] [EMAIL PROTECTED]
Can you provide the perl code you used..?
Also, if you have magic_quotes_runtime ini option set to off, it'll be
faster.
------------------------------------------------------------------------
[2005-04-23 23:11:07] peoned at yahoo dot com
Description:
------------
fgets() is too slow in PHP. It is a lot slower than in Perl or C, the
languages I compared it to. I read and wrote out a 20 MB file in PHP,
Perl, and C (all by line). Here are my results
C: 0.938s, 0.949s, 0.945s, 0.943s
Perl: 4.946s, 2.123s, 2.119s, 2.158s
php: 15.606s,11.637s, 11.675s, 11.260s
I ran tests on 2 computers, with fairly similar results. And another
person from a forum who I asked about fgets() ran it with approximately
6 seconds in Windows and 7 in Linux for a 15 MB file.
Replacing fgets() with fread($fin, 1024) gives these results
0.835s,0.797s,0.812s,0.836s
So the problem is with fgets(). Perl is slower than C because C is
compiled and Perl is interpreted. But there isn't a reason why php
should be that much slower than Perl. And fgets() should be slower than
fread() but not by that much.
Reproduce code:
---------------
parse_p("in.txt", "out.txt");
function parse_p($in_file, $out_file)
{
$fin = fopen($in_file, "rb");
$fout = fopen($out_file, "wb");
while(!feof($fin))
{
$line = fgets($fin);
fwrite($fout, $line);
}
fclose($fin);
fclose($fout);
}
Expected result:
----------------
I expect it to be comparable to Perl or C in speed
Actual result:
--------------
It was much slower than Perl or C
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=32806&edit=1