Schrift
[thread]9758[/thread]

md5sum lieber von Linux oder als Modul?



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Reputation
 2005-03-16 17:05
#95340 #95340
User since
2005-03-09
9 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich wollte in einem Skript einige Dateien mit Hilfe von md5sum auf Gleichheit prüfen.
Ursprünglich wollte ich das ganz normal über den Linux Befehl md5sum machen. Jetzt habe ich aber bei Cpan gesehen dass es auch ein md5sum Modul für Perl gibt.

Ich wüßte jetzt nur gerne was effektiver ist. Ist es besser (und schneller) den Linux-Befehl zu benutzen oder das Modul?

Eigentlich dachte ich immer dass eine der Stärken von Perl ist dass ich Befehle der Shell direkt ausführen kann. Aber die Tatsache dass es trotzdem ein Modul dafür gibt hat mich ein wenig irritiert. Was ist also besser? Modul oder Shell?

MfG Marcel
Etwas nicht tun zu können ist kein Grund etwas nicht zu tun.
GwenDragon
 2005-03-16 17:17
#95341 #95341
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
[quote=Reputation,16.03.2005, 16:05]Ich wüßte jetzt nur gerne was effektiver ist. Ist es besser (und schneller) den Linux-Befehl zu benutzen oder das Modul?

Eigentlich dachte ich immer dass eine der Stärken von Perl ist dass ich Befehle der Shell direkt ausführen kann. Aber die Tatsache dass es trotzdem ein Modul dafür gibt hat mich ein wenig irritiert. Was ist also besser? Modul oder Shell?[/quote]
Das Programm ist natürlich schneller als das Perl-Modul bzw. es kommt darauf an, wie das Modul implemetiert ist.
Das Modul gibt es, weil viele andere Perl-Programme und Module auch manchmal MD5 brauchen.

Zudem gibt es Situationen, wo du eben md5sum nicht über die Shell aufrufen kannst, dann hilft nur noch das Perl-Modul!

Zur Performance eine Frage. Von wie vielen Dateien Prüfsummen erzeugen?

//Edit: habe nur halb gelesen, sorry.\n\n

<!--EDIT|GwenDragon|1110986482-->
ptk
 2005-03-16 17:18
#95342 #95342
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ein externes Programm aufzurufen ist relativ teuer. Ich habe gerade mal md5sum gegen Digest::MD5 getestet: 0.97 vs. 0.03 Sekunden.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w 
use Digest::MD5 qw(md5_hex);
use Time::HiRes qw(gettimeofday tv_interval);

my $howmany = shift || 100;

my $t0;

$t0 = [ gettimeofday ];
for (1..$howmany) { system("md5sum", $0) }
print STDERR tv_interval($t0), "\n";

$t0 = [ gettimeofday ];
for (1..$howmany) {
open(my $SELF, $0) or die $!;
local $/ = undef;
my $buf = <$SELF>;
close $SELF;
print md5_hex($buf), "\n";
}
print STDERR tv_interval($t0), "\n";

Aufruf mit
Code: (dl )
skript.pl 1000 > /dev/null
ptk
 2005-03-16 17:21
#95343 #95343
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nachtrag: ich sehe gerade, dass man md5sum eine Liste von Dateien uebergeben kann. In diesem Fall ist md5sum wahrscheinlich schneller oder genau so schnell, da das Programm nur einmal aufgerufen werden kann.

Ein anderer Grund fuer die Verwendung eines Moduls ist die Portierbarkeit. md5sum ist ein Linuxismus, bei *BSD heisst es beispielsweise md5, und Windows hat wahrscheinlich gar kein md5-Programm.
Reputation
 2005-03-16 17:54
#95344 #95344
User since
2005-03-09
9 Artikel
BenutzerIn
[default_avatar]
Also sollte ich lieber den Shell Befehl benutzen, weil er im Endeffekt doch schneller ist?
Da das Skript eh nur auf gleichen Servern läuft, die alle md5sum haben brauche ich ja nicht zu beachten dass versch. Distributionen verschiedene Namen für das Programm haben.

Ich bin zwar noch nicht wirklich firm in Linux und Perl, aber dank Eurer Unterstützung bin ich schon weit gekommen in meinem Programm.
Perl fängt an mir richtig Spaß zu machen.

Vielen Dank Euch allen für die schnelle Antwort.
Etwas nicht tun zu können ist kein Grund etwas nicht zu tun.
Strat
 2005-03-16 18:52
#95345 #95345
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich versuche immer, moeglichst viel in perl selbst zu machen, wuerde also zuerst mal Digest::MD5 verwenden. Erst wenn das definitiv zu langsam sein sollte, wuerde ich mich nach alternativen umsehen, also z.B. md5sum

Warum ich die interne Loesung bevorzuge?
x) ist portabler
x) bei externen Programmen hat man mehr unnoetige Abhaengigkeiten, die man ueberpruefen muss (z.B. ist das Programm unter diesem namen vorhanden? kann der User das Programm ueberhaupt ausfuehren? ...) und die Fehlerabfrage ist in der Regel aufwendiger, weil unterschiedliche betriebssysteme/versionen oft unterschiedlichen output generieren (siehe z.B. ping)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2005-03-16 20:12
#95346 #95346
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich habe gerade mal ein paar Tests gemacht, sowohl mit wenigen (5) grossen (> 300 MB) Dateien als auch mit vielen (> 2'500) kleineren (0.001..3 MB) Dateien.
Code: (dl )
$ time perl -MDigest::MD5 -e 'while($f=shift){open F,$f or do {warn $!; next}; binmode F; print Digest::MD5->new->addfile(*F)->hexdigest, " $f\n"; close F; }' * > /dev/null

gegen
Code: (dl )
$ time md5sum * > /dev/null

gab keinen signifikanten Unterschied.
betterworld
 2005-03-16 22:15
#95347 #95347
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Digest::MD5 ist in C geschrieben, daher ist es sicher nicht weniger performant
als md5sum.

Deine Behauptung, dass ein Vorteil von Perl ist, dass man externe Programme
einfach aufrufen kann, ist nur halbwahr. Natuerlich ist es praktisch, dass man
das kann, und es entspraeche der Unix-Philosophie (naemlich: fuer jeder Aufgabe
nur ein einziges kleines Tool), das auch zu tun. Dennoch zaehlt es allgemein
als guter Perl-Stil, stattdessen Perl-Module zu verwenden. Das liegt nicht nur
an der besseren Portabilitaet, sondern auch daran, dass so weniger Prozesse
geforkt werden muessen und der Engpass der Parameteruebergabe vermieden wird.\n\n

<!--EDIT|betterworld|1111011297-->
Strat
 2005-03-17 00:03
#95348 #95348
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
irgendwie habe ich den eindruck, dass viele computer-erfahrene anfaenger (sehr oft sind mir unix-admins aufgefallen, die in shellscripten fit sind), am anfang perl genauso als shellscriptsprache behandeln und sie nur dazu benuetzen, um externe kommandos der reihe nach auszufuehren... wenn sie dann mehr perl lernen, steigen sie dann oft immer mehr auf perl-"interne" loesungen (d.h. module) um. bei mir war es nicht so extrem (ok, bin kein admin, sondern habe programmieren mit anderen sprachen gelernt), aber manche ansaetze entdecke ich bei mir da auch; habe frueher z.B. unter windows mails sehr gerne mit blat versendet, und unter unix mit sendmail, und mir fiel gerade auf, dass ich beide programme schon seit mindestens zwei Jahren nicht mehr direkt angesteuert habe, und auch fuer komplexere sachen fast nur noch perl-"intern" bleibe...

geht es euch auch so?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Reputation
 2005-03-17 00:05
#95349 #95349
User since
2005-03-09
9 Artikel
BenutzerIn
[default_avatar]
Wow....ich hätte nicht gedacht, dass es wirklich eine interessante Frage ist, mit der sich so viele Leute beeschäftigen können.

Ich hatte schon Angst, dass ich eine totale DAU Frage gestellt habe.

Danke Euch allen nochmals für die Antworten.
Etwas nicht tun zu können ist kein Grund etwas nicht zu tun.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-03-16 17:05.