#32806 [Fbk->Opn]: fgets() function is slow

2005-05-04 Thread peoned at yahoo dot com
 ID:   32806
 User updated by:  peoned at yahoo dot com
 Reported By:  peoned at yahoo dot com
-Status:   Feedback
+Status:   Open
 Bug Type: Performance problem
 Operating System: Linux
 PHP Version:  5.0.4
 Assigned To:  wez
 New Comment:

without fwrite() it is significantly faster, gives about 5-6 seconds.
But in Perl without print OUT $_; it gives around 1-2 seconds. So it is
still slower in PHP because of fgets().


Previous Comments:


[2005-05-02 14:25:11] [EMAIL PROTECTED]

Can you try your tests with the fwrite() line commented out?



[2005-04-28 07:30:31] peoned at yahoo dot com

I did an 
`echo strlen($line).",";` 
Here are the lengths for some of the first few lines:
42,7,18,11,71,13,8,7,42,7,20,11,73,70,68,63,13,8,7

It looks pretty much like this for the rest of the file. Lines between
1 and 100 chars in length.

Note: It isn't the start up cost for sure because I measured the time
just around the while loop with the same results.



[2005-04-28 04:37:03] [EMAIL PROTECTED]

How long are the lines in your file?



[2005-04-28 01:58:55] [EMAIL PROTECTED]

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.



[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?



The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/32806

-- 
Edit this bug report at http://bugs.php.net/?id=32806&edit=1


#32806 [Fbk->Opn]: fgets() function is slow

2005-04-27 Thread peoned at yahoo dot com
 ID:   32806
 User updated by:  peoned at yahoo dot com
 Reported By:  peoned at yahoo dot com
-Status:   Feedback
+Status:   Open
 Bug Type: Performance problem
 Operating System: Linux
 PHP Version:  5.0.4
 New Comment:

I did an 
`echo strlen($line).",";` 
Here are the lengths for some of the first few lines:
42,7,18,11,71,13,8,7,42,7,20,11,73,70,68,63,13,8,7

It looks pretty much like this for the rest of the file. Lines between
1 and 100 chars in length.

Note: It isn't the start up cost for sure because I measured the time
just around the while loop with the same results.


Previous Comments:


[2005-04-28 04:37:03] [EMAIL PROTECTED]

How long are the lines in your file?



[2005-04-28 01:58:55] [EMAIL PROTECTED]

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.



[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, "perl_out.txt");

while()
{
print OUT $_;
}

close(OUT);
close(IN);


C code:

#include 
#include 

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



The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/32806

-- 
Edit this bug report at http://bugs.php.net/?id=32806&edit=1


#32806 [Fbk->Opn]: fgets() function is slow

2005-04-23 Thread peoned at yahoo dot com
 ID:   32806
 User updated by:  peoned at yahoo dot com
 Reported By:  peoned at yahoo dot com
-Status:   Feedback
+Status:   Open
 Bug Type: Performance problem
 Operating System: Linux
 PHP Version:  5.0.4
 New Comment:

Perl code:

#!/usr/local/bin/perl

open(IN, "perl_out.txt");

while()
{
print OUT $_;
}

close(OUT);
close(IN);


C code:

#include 
#include 

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


Previous Comments:


[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