|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-04-23 23:11 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 05:00:01 2025 UTC |
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 offI 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?I'm getting similar behavior with php 5.2.1. I am reading about 5,000 lines over a tcp socket to another program on the localhost (NOT over a network). Initially, it takes about 500 us per line of text (where the lines are < 20 characters long). Here is the code snippet and output: while (/* some eof and timeout checks here */) { $rstart = microtime(TRUE); $str = fgets($this->dataSocket, 8096); $rstop = microtime(TRUE); $rdiff = $rstop - $rstart; print("read took $rdiff secs.<br>\n"); print("str = $str<br>\n"); } This yields, for example: str = 16549|Item2250||3|2| read took 0.00049185752868652 secs. str = 16550|Item2251||3|2| read took 0.00049495697021484 secs. str = 16551|Blob2252||3|2| read took 0.00049018859863281 secs. I run that over a full dump of my text (5000 lines). If I then close the socket, open a new one, and do the same operation, about halfway through the fgets() times start increasing dramatically: str = 16645|Item2346||3|2| read took 0.0019731521606445 secs. str = 16646|Item2347||3|2| read took 0.0019690990447998 secs. str = 16647|Item2348||3|2| read took 0.0020229816436768 secs. 2 ms to read each short line?? Again, this is just over a local socket, nothing over the network. This is reproducible every time on my system. Thanks.