PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellscripts kompilieren



SeeksTheMoon
15.07.04, 10:47
Ich arbeite viel mit Shellscripten und habe mich gelegentlich über die Performance der scripts geärgert; z.B. braucht eine Funktion die ein paar Punkte zeichnet wie hier:

Bearbeite Datei1.png ........... [ OK ]
Bearbeite Die_Naechste ......... [ OK ]
für jeden Punkt fast eine Sekunde und das summiert sich auf.

Ich habe deshalb nach einem Weg gesucht wie man Shellscripte beschleunigen kann und habe dabei das Tool "shc" gefunden, das aus einem Shellscript eine richtige binary macht und dazu sogar den C-Quellcode erzeugt.
Ein nettes Feature: Man kann diese Dateien mit Verfallsdatum versehen, was sich für kommerzielle Shellscripts eignet.

http://www.datsi.fi.upm.es/~frosal/ ist die Homepage. Getestet habe ich es noch nicht, aber dass ein C-Programm schneller als ein Script-Interpreter ist, ist mal logisch.

Roger Wilco
15.07.04, 13:36
z.B. braucht eine Funktion die ein paar Punkte zeichnet wie hier:

Bearbeite Datei1.png ........... [ OK ]
Bearbeite Die_Naechste ......... [ OK ]
für jeden Punkt fast eine Sekunde und das summiert sich auf.
Hast du schonmal daran gedacht, dass das Skript neben der Ausgabe der Punkte auch noch etwas anderes macht und die Punkte nur zur Anzeige des Fortschritts ausgegeben werden?


Getestet habe ich es noch nicht, aber dass ein C-Programm schneller als ein Script-Interpreter ist, ist mal logisch.
Das kommt darauf an, was gemacht wird. Bei massiven (mathematischen) Berechnungen ist ein kompiliertes Programm sicherlich schneller. Aber wenn das Shellskript nur einige Dateien umbenennt oder andere nicht rechenintensive Dinge macht, bringt dir das kompilieren rein gar nichts.

SeeksTheMoon
15.07.04, 14:50
Hast du schonmal daran gedacht, dass das Skript neben der Ausgabe der Punkte auch noch etwas anderes macht und die Punkte nur zur Anzeige des Fortschritts ausgegeben werden?
Die Anzahl der Punkte werden ausgerechnet und dann in einer Schleife ausgegeben. Ich weiß das weil ich das geschrieben habe ;-)

Der Geschwindigkeitsgewinn ist übrigens nicht so groß bei meinem Script, vielleicht bringt es mehr, wenn nicht zu viele externe Programme aufgerufen werden.
Aber der Hauptvorteil liegt wohl auch eher bei der Verschleierung des Inhalts und beim "Haltbarkeitsdatum", wenn man das braucht.

kl47
19.07.04, 15:22
Aber der Hauptvorteil liegt wohl auch eher bei der Verschleierung des Inhalts und beim "Haltbarkeitsdatum", wenn man das braucht.

Oh ja, was für ein Vorteil, genau für sowas wurde Linux konzipiert... :rolleyes:

eclipse
19.07.04, 15:29
Also ich hab das Teil mal ausprobiert.
Bei einfachen Shellscripten, funzt es einwandfrei.
Aber sobald sie etwas komplexer werden versagt das Teil kompilierte Teil dann.

hp_tux
19.07.04, 19:06
Hallo,


Bei einfachen Shellscripten, funzt es einwandfrei.
Aber sobald sie etwas komplexer werden versagt das Teil kompilierte Teil dann.
ja, sowas gab es auch schon mal bei DOS: einen Compiler für Batchdateien. Allerdings auch mit dem gleichen Ergebnis... ;)

Eigentlich ganz nett, aber leider nicht wirklich brauchbar... :ugly:

Gruß

hp_tux

Jasper
19.07.04, 20:26
für jeden Punkt fast eine Sekunde und das summiert sich auf.


$ time ./bla.sh 1000000 >/dev/null
real 0m33.580s
user 0m32.890s
sys 0m0.630s

$ cat bla.sh
#!/bin/sh
I=$1
while [ $I -gt 0 ]; do
echo -n "."
I=$((I-1))
done


also 1 mio. punkte in 33 sek. auf einem P4-1.4Ghz notebook; ich würde sagen, du machst irgendwas falsch.


-j

SeeksTheMoon
19.07.04, 21:13
also 1 mio. punkte in 33 sek. auf einem P4-1.4Ghz notebook; ich würde sagen, du machst irgendwas falsch.
so einfach ist das nicht, die Anzahl der Punkte wird mit einem etwas längeren Ausdruck berechnet - in jedem Schleifendurchlauf, weil für verschiedene Dateinamen.


Oh ja, was für ein Vorteil, genau für sowas wurde Linux konzipiert...
Keine Ahnung dass wir im Kapitalismus leben und übersieht dabei auch noch voll, dass es hier um Shellscripte und nicht um den Linuxkernel und dessen angebliches Konzept geht -> Think before you post!

Jasper
19.07.04, 22:23
so einfach ist das nicht, die Anzahl der Punkte wird mit einem etwas längeren Ausdruck berechnet - in jedem Schleifendurchlauf, weil für verschiedene Dateinamen.


das dachte ich mir schon, nur steht davon kein wort in deinem anfangspost. wenn möglich zeig doch mal den "etwas längeren ausdruck" oder gleich den codeschnipsel der die anzahl der punkte anhand der länge des dateinamens berechnet damit das ganze hübsch fomatiert aussieht. ich hatte sowas ähnliches mal gebraucht und das ist sauschnell:

/usr/bin/php............................................... ...................OK
2132 weitere solcher zeilen...

real 0m8.724s
user 0m4.120s
sys 0m0.170s

und dabei werden die punkte wirklich einer nach dem anderen ausgegeben. wenn man das intelligent löst wird das ganze ultraschnell:

/usr/bin/php............................................... ...................OK
2132 weitere solcher zeilen...

real 0m0.342s
user 0m0.160s
sys 0m0.010s


-j

JDieskau
20.07.04, 01:00
Ich will ja nichts sagen, aber kann es sein das es die Seite nicht gibt bzw. nicht erreichbar ist?

iceface
20.07.04, 01:06
Ich will ja nichts sagen, aber kann es sein das es die Seite nicht gibt bzw. nicht erreichbar ist?
Um diese Uhrzeit haben einige Seiten immer mal nen break.

Probiers mal mit dem google-cache:

http://www.google.de/search?q=cache:uh874-CAkhEJ:www.datsi.fi.upm.es/~frosal/+&hl=de

SeeksTheMoon
20.07.04, 11:53
wenn möglich zeig doch mal den "etwas längeren ausdruck" oder gleich den codeschnipsel

Ich hatte

function eyecandy() {
i=0
while [ $i -lt `expr $MAXLAENGE - $(echo $BILD|wc -m)` ]
do
echo -n "."
i=`expr $i + 1`
done
}

habe das aber zu folgendem geändert:

function eyecandy() {
i=0
anz=$(expr $MAXLAENGE - $(echo $BILD|wc -m))
while [ $i -lt $anz ]
do
echo -n "."
i=`expr $i + 1`
done
}
sonst rechnet er in jedem Schleifendurchlauf herum, was die Verzögerung verursacht hat (spart 2 Minuten bei mir)

Wenn ich den Ausdruck i=`expr $i + 1` rauswerfe und durch ein eigenes C-Programm ersetze (i=`incr $i`)), dann bringt mir das sogar noch einen Zeitgewinn. Wenn ich das Shellscript kompiliere, dann ist das eigene C-Programm aber langsamer als der expr-Ausdruck... interessant...

incr.c:


#include <stdio.h>

int main(int argc, char* argv[]) {
printf("%d",atoi(argv[1])+1);
return 0;
}

JDieskau
20.07.04, 18:48
Wenn ich den Ausdruck i=`expr $i + 1` rauswerfe und durch ein eigenes C-Programm ersetze (i=`incr $i`)), dann bringt mir das sogar noch einen Zeitgewinn. Wenn ich das Shellscript kompiliere, dann ist das eigene C-Programm aber langsamer als der expr-Ausdruck... interessant...

Hier mal ein Zitat aus der Manpage ;)

Upon execution, the compiled
binary will decrypt and execute the code with the shell -c
option. Unfortunatelly, it will not give you any speed
improvement as a real C program would.

Jasper
20.07.04, 19:19
Ich hatte

function eyecandy() {
i=0
while [ $i -lt `expr $MAXLAENGE - $(echo $BILD|wc -m)` ]
do
echo -n "."
i=`expr $i + 1`
done
}

habe das aber zu folgendem geändert:

function eyecandy() {
i=0
anz=$(expr $MAXLAENGE - $(echo $BILD|wc -m))
while [ $i -lt $anz ]
do
echo -n "."
i=`expr $i + 1`
done
}
sonst rechnet er in jedem Schleifendurchlauf herum, was die Verzögerung verursacht hat (spart 2 Minuten bei mir)


die vielen externen aufrufe machen das ganze langsam. versuchs mal damit;

#!/bin/sh
for F in $(find $1 -type f); do
echo -n $F
I=$((78-${#F}))
while [ $I -gt 0 ]; do
echo -n "."
I=$((I-1))
done
echo "OK"
done

oder die highspeed-variante:

P='............................................... ...............................'
for F in $(find $1 -type f); do
I=$((78-${#F}))
echo "${F}${P:0:$I}OK"
done

wenn die shell das nicht hergibt, nimm lieber awk:

find $1 -type f | awk 'BEGIN {T=".................................................. ........................." } {print $1 substr(T,0,78-length($1)) "OK"}'

/usr/bin/php............................................... ...................OK
2000 weitere zeilen

real 0m0.209s
user 0m0.000s
sys 0m0.000s

alle 3 varianten sind ausreichend schnell.


-j

Dragoran
23.07.04, 08:29
Das kommt darauf an, was gemacht wird. Bei massiven (mathematischen) Berechnungen ist ein kompiliertes Programm sicherlich schneller. Aber wenn das Shellskript nur einige Dateien umbenennt oder andere nicht rechenintensive Dinge macht, bringt dir das kompilieren rein gar nichts
Bei komplizierten Berechnungen verwendet sollte man eh C verwenden.

Roger Wilco
23.07.04, 09:22
Bei komplizierten Berechnungen verwendet sollte man eh C verwenden.
Es gibt auch noch andere Programmiersprachen neben C und C++ ;)

comrad
25.07.04, 17:08
Bei komplizierten Berechnungen verwendet sollte man eh C verwenden.
Für mathematische Modelle nimmt man immernoch Ada95 und Pascal.

BigBudda
07.08.04, 20:32
... aber dass ein C-Programm schneller als ein Script-Interpreter ist, ist mal logisch.

Ein von einem erfahrenen Programmierer geschriebenes C-Programm sicherlich, aber automatisch generierter C-Code (z.B. aus SHELL oder PERL-Code) ist meistens mehr KOT als CODE. So habe ich letztens in der Arbeit versucht ein einfaches PERL-"Hello World"-Programm (1 zeile + #!/usr/bin/perl) zu C-Code zu machen (ich verzichte mal auf nennung des Umwandlungsprogrammes, sonst klagt mich noch jemand an, ist ja schlimm geworden in letzter Zeit... :( ).
Naja auf jeden Fall kamen so um die 1300 Zeilen völlig schwachsinniger und unüberblickbarer C-Code dabei raus - die dann auch nur unter Protest zu Kompilieren waren.

Fazit: Scriptsprachen sind Scriptsprachen, für Binaries gibt es immer noch Assembler ;-) - und wer dazu nicht den Mumm hat ( :D und nein, ich kann auch kein Stück Assembler programmieren) kann ja immer noch C/C++ oder was auch immer verwenden.

So das war erstmal mein ausgedehnter Senf dazu.

MfG Budda

oyster-manu
07.09.04, 15:58
Keine Ahnung dass wir im Kapitalismus leben und übersieht dabei auch noch voll, dass es hier um Shellscripte und nicht um den Linuxkernel und dessen angebliches Konzept geht -> Think before you post!

sorry, aber wer hier sein denkorgan zuerst benutzen sollte bist du.
schonmal die GPL durchgelesen? es spielt keine rolle ob es sich um ein shellscript handelt oder um den linuxkernel oder andere software.

Blackhawk
07.09.04, 16:23
Hat er denn gesagt, dass sein Script OpenSource sein soll?
Oracle laeuft ja auch unter Linux, ist ne tolle Software und man muss dafeur bezahlen...

BloodyBullet
07.09.04, 17:39
sorry, aber wer hier sein denkorgan zuerst benutzen sollte bist du.
schonmal die GPL durchgelesen? es spielt keine rolle ob es sich um ein shellscript handelt oder um den linuxkernel oder andere software.
Kannst du mal bitte die Stelle zitieren, in der die GPL vorschreibt, dass jedes Programm welches explizit für Linux geschrieben wurde, Open Source sein muss. Danke.

MfG

Chaoswind
07.09.04, 18:31
Für mathematische Modelle nimmt man immernoch Ada95 und Pascal.

Du meinst wohl Fortran. Bzw. Ruby oder Python wenn es um's gekritzel geht.