Es gab einen Fall, in dem ich in meinem Geschäft viel Text verarbeiten musste, also habe ich es mit Ruby geschafft, aber es ist wirklich langsam ... Es gibt Raum für Akkordstimmung, aber da es keine Geschichte ist, wenn Sie zuerst einen langsamen Typ verwenden, habe ich beschlossen, den Geschwindigkeitsunterschied im Haupt-LL zu messen.
Für einen kleinen Text (6 MB) war es ein Perl-Sieg, und für einen großen Text war es ein Python-Sieg. In jedem Fall entkommt Ruby dem Boden mit einem kleinen Rand, aber es ist spät. Dies steht im Gegensatz zu Perl und Python, wo ihre Stärken und Schwächen weitgehend geteilt sind.
Zuerst von Ruby-Spielern
show_ruby_version
$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
Der zu verwendende Code lautet wie folgt
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
Nächster Python-Player
show_python_version
$ python --version
Python 2.7.2
Der zu verwendende Code lautet wie folgt
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()
Endlich ein großer Perl-Veteran
show_perl_version
$ perl -v
This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-thread-multi-2level
#(Da es lang ist, wird es unten weggelassen)
Der zu verwendende Code lautet wie folgt
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);
Auf diese Weise ist die Logik in jeder Sprache fast gleich und macht nicht viel.
Da es sich um einen regulären Ausdruck + das Schreiben von Dateien handelt, handelt es sich nicht um einen Vergleich der Fähigkeit zu reinen regulären Ausdrücken. Bitte verzeihen Sie mir, denn der Grund für diesen Benchmark ist die Verarbeitung einer großen Textmenge (Extrahieren bestimmter Daten mit einem regulären Ausdruck und Schreiben in eine Datei).
Da wir die Speicherfreigabe jeder Sprache nicht richtig berücksichtigt haben, kann sich das Ergebnis erneut ändern, wenn wir es richtig machen. Bitte verwenden Sie es nur als Referenz.