ID: 32806 User updated by: peoned at yahoo dot com Reported By: peoned at yahoo dot com -Status: Bogus +Status: Open Bug Type: Performance problem Operating System: Linux PHP Version: 5.0.4 New Comment:
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? Previous Comments: ------------------------------------------------------------------------ [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