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, "<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


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

Reply via email to