Il y a eu un cas où j'ai dû faire beaucoup de traitement de texte dans mon entreprise, alors je l'ai fait avec Ruby, mais c'est vraiment lent ... Il y a de la place pour le réglage en termes de code, mais comme ce n'est pas une histoire si vous utilisez un gars lent, j'ai décidé de mesurer la différence de vitesse dans la LL principale.
Pour un petit texte (6 Mo), c'était une victoire Perl, et pour un gros texte, c'était une victoire Python. Dans chaque cas, Ruby s'échappe du fond par une petite marge, mais il est tard. Cela contraste avec Perl et Python, où leurs forces et leurs faiblesses sont largement divisées.
D'abord des joueurs Ruby
show_ruby_version
$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
Le code à utiliser est le suivant
regex_test.rb
#!/usr/bin/env ruby
re_addr = /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/
fh2 = open("./result_rb.txt", "w")
open("./access.log.1") { |fh|
while line = fh.gets
if m = re_addr.match(line)
fh2.puts m[1]
end
end
}
fh2.close
Joueur Python suivant
show_python_version
$ python --version
Python 2.7.2
Le code à utiliser est le suivant
regex_test.py
#!/usr/bin/env python
import re
re_addr = re.compile("((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))")
fh2 = open('./result_py.txt', 'w')
fh = open('./access.log.1')
for line in fh.readlines():
m = re_addr.search(line)
if m is not None:
fh2.write(m.group(1))
fh2.write("\n")
fh.close()
fh2.close()
Enfin, un grand joueur Perl vétéran
show_perl_version
$ perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
#(Comme il est long, il est omis ci-dessous)
Le code à utiliser est le suivant
regex_test.pl
#!/usr/bin/env perl
open(FH2, ">", "./result_pl.txt");
open(FH, "<", "./access.log.1");
while($line = readline FH) {
if ($line =~ /((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/) {
print FH2 $1."\n";
}
}
close(FH);
close(FH2);
Comme ça, la logique est presque la même dans chaque langue, et ça ne fait pas grand-chose.
Puisqu'il s'agit d'une expression régulière + écriture de fichier, ce n'est pas une comparaison de la capacité d'expression régulière pure. Cependant, pardonnez-moi car la raison de ce benchmark est le traitement d'une grande quantité de texte (extraire des données spécifiques avec une expression régulière et les écrire dans un fichier).
Puisque nous n'avons pas correctement considéré la libération de mémoire de chaque langue, le résultat peut changer à nouveau si nous le faisons correctement. Veuillez l'utiliser comme référence uniquement.