#32806 [Fbk->Opn]: fgets() function is slow
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
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
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