Comparativa entre lenguajes IV

Esta es una pequeña variación del anterior. El archivo que se maneja ahora son 256 Mb (el mcedit no es capaz de editarlo, y al vi le cuesta un rato...)



#include

int main() {
FILE *fe, *fs;
unsigned char buffer[2048]; // Buffer de 2 Kbytes
int bytesLeidos;
int caracteres=0;

fe = fopen("dat.c", "r");
if(!fe) {
printf("El fichero %s no existe o no puede ser abierto.\n", "dat.c");
return 1;
}
fs = fopen("out.c", "w");
if(!fs) {
printf("El fichero %s no puede ser creado.\n", "out.c");
fclose(fe);
return 1;
}

while((bytesLeidos = fread(buffer, 1, 2048, fe)))
fwrite(buffer, 1, bytesLeidos, fs);
fclose(fe);
fclose(fs);
fe= fopen("dat.c", "r");
fs= fopen("out.c", "r");
while(!feof(fe)) {
if (fgetc(fe)==fgetc(fs)) {
caracteres++;
}
}
fclose(fe);
fclose(fs);
fe= fopen("dat.c", "r");
fs= fopen("out.c", "r");
while(!feof(fe)) printf("%c",fgetc(fe));
while(!feof(fs)) printf("%c",fgetc(fs));
fclose(fe);
fclose(fs);
printf("el numero de caracteres es %d \n",caracteres);
return 0;
}
#!/usr/bin/ruby
buffer=""
caracteres=0
fe = File.new("dat.rb", "r")
fs = File.new("out.rb", "w")
while not (fe.eof?)
fe.read(2048,buffer)
fs.print(buffer)
end
fs.close
fe.close
fe = File.new("dat.rb", "r")
fs = File.new("out.rb", "r")
while not (fe.eof?)
if fe.getc == fs.getc
caracteres+=1
end
end
fs.close
fe.close
fe = File.new("dat.rb", "r")
fs = File.new("out.rb", "r")
fe.each_line {|line| puts line }
fs.each_line {|line| puts line }
fs.close
fe.close
puts "el numero de caracteres es "+caracteres.to_s

#!/usr/bin/perl
$buffer="00000000000000000000000000000000000000";
$caracteres=0;
open FE, "dat.pl";
open FS, ">out.pl";
while($buffer = ) {
print FS $buffer;
}
close FE;
close FS;
open FE, "dat.pl";
open FS, "out.pl";
while($char = getc(FE)) {
$char2=getc(FS);
if ($char == $char2) {
$caracteres++;
}
}
close FE;
close FS;
open FE, "dat.pl";
open FS, "out.pl";
while($linea = ) {print $linea;}
while($linea = ){ print $linea;}
close FE;
close FS;
print "$caracteres \n";


Ejecutamos cada uno consecutivamente, con un pequeño descanso tras cada uno:

time ./IO > log && sleep 60 && time ./IO.rb > log && sleep 60 && time ./IO.pl > log

C
real 2m26.733s
user 2m4.612s
sys 0m7.064s

ruby
real 14m45.380s
user 14m2.765s
sys 0m23.749s

perl
real 15m12.326s
user 14m48.728s
sys 0m8.397s

Aparte de las diferencias con C (7 veces más lentos), vemos que el tiempo de ruby es mejor, salvo en el tiempo de sistema. Interesante.

No hay comentarios: