Hits :
4143
Comparison of Scripting Languages
Overview
Στην δουλειά μας χρειάζεται αρκετές φορές να αναπτύξουμε ένα νέο πρόγραμμα ή να
τροποποιήσουμε κάποιο ήδη υπάρχον. Η επιλογή της γλώσσας προγραμματισμού σχεδόν πάντα
έχει μοναδικό κριτήριο το πόσο καλά εξοικειωμένοι είμαστε με αυτήν. Όμως μερικά κριτήρια
που θα πρέπει να έχουμε στο μυαλό μας είναι τα εξής:
- Εξοικείωση
- Ταχύτητα Εκτέλεσης
- Δυνατότητα βελτιστοποίησης
- Δυνατότητα Επαναχρησιμοποίησης
- Δυνατότητα Διεπαφής
Στην προσπάθειά μου να βρω ποια scripting language θα ήταν "καλύτερη" για την ανάπτυξη ενός
προβλήματος που είχα, αφιέρωσα λίγο χρόνο ώστε να γράψω ένα πρόγραμμα σε διάφορες scripting
languages και να παράγω μερικές χρήσιμες μετρήσεις.
top
Αλγόριθμος
To project που είχα στο μυαλό μου ήταν η παραγωγή dns records για ένα class b.
Θα έπρεπε δλδ να βρω έναν τρόπο ώστε να παραχθούν το μέγιστο
65536 dns records.
Φυσικά επειδή έπρεπε το script να μπορεί να τροποποιηθεί ώστε να καλύπτει όλα τα class b & c
ή ακόμα και μέρος αυτών (sub-classes) κατέληξα στον παρακάτω αλγόριθμο :
ορισμός του class b
ορισμός του αρχικού class c
ορισμός του πλήθος των class c
ορισμός του πλήθος των διευθύνσεων ip
ορισμός της αρχικής διεύθυνσης ip
ορισμός του dns ονόματος του κάθε A dns record
ορισμός της αρχικής αριθμητικής τιμής ενός dns ονόματος
Επαναληπτική διαδικασία για το πλήθος των class c
Επαναληπτική διαδικασία για το πλήθος των ip διευθύνσεων
Εμφάνισε 'το dns όνομα κάθε A dns record'
Αν η αριθμητική τιμή ενός dns ονόματος είναι κάτω του 1000 τότε
τύπωσε το γράμμα 0
Τέλος Αν
Αν η αριθμητική τιμή ενός dns ονόματος είναι κάτω του 100 τότε
τύπωσε το γράμμα 0
Τέλος Αν
Αν η αριθμητική τιμή ενός dns ονόματος είναι κάτω του 10 τότε
τύπωσε το γράμμα 0
Τέλος Αν
Εμφάνισε 'την αριθμητική τιμή ενός dns record'
Εμφάνισε ' IN A '
Εμφάνισε 'το class b'
Εμφάνισε 'το class c'
Εμφάνισε 'την ip'
Αύξησε κατά 1 'την αριθμητική τιμή ενός dns record'
Τέλος της επαναληπτικής διαδικασίας για το πλήθος των ip διευθύνσεων
Αύξησε κατά 1 'το class c'
Τέλος επαναληπτικής διαδικασίας για το πλήθος των class c
top
Implementation
Ο παραπάνω αλγόριθμος (κάθε φορά με τις απαραίτητες διορθώσεις) γράφτηκε στις παρακάτω scripting languages:
- perl
- python
- php
- tcl
- ruby
- bash
- sh
Και η υλοποίηση βρίσκεται στα εξής links:
Μερικές παρατηρήσεις:
Ο αλγόριθμος και η συγγραφή αυτού στις παραπάνω γλώσσες ΔΕΝ είναι ο τέλειος ή ο βέλτιστος.
Έγινε προσπάθεια η υλοποίηση να είναι παρόμοια για τις ανάγκες της σύγκρισης.
Πρώτη φορά γράφω σε : Perl, Python, Ruby & Tcl, έχω όμως την δυνατότητα να διαβάσω
από τα references manuals της κάθε γλώσσας, οπότε και πιστεύω ότι έγινε καλή δουλεια :p
Η τελευταία υλοποίηση είναι του
Fuzz από τον σύλλογο
Ioannina Linux User Group[link7] και είναι
το dslbash τροποποιημένο ώστε να είναι POSIX compliant. -Thanks Fuzz
Επίσης έχω κάνει τροποποιήσεις πάνω στις παρατηρήσεις του
Κεραμιδά από το παρακάτω link από το forum του hellug. -Τhanks Γιώργο.
top
Results
Μετρήσεις μπορείτε να βρείτε εδώ:
http://forum.hellug.gr/index.php?topic=623.0
Οι δικές μου μετρήσεις έγιναν σε ένα μηχάνημα με τα εξής χαρακτηριστικά:
Intel(R) Pentium(R) D CPU 3.40GHz
1 GB Ram
2 GB Swap
160 GB Sata HD
xubuntu 7.10
2.6.22-14-generic #1 SMP
Results
Όπως βλέπετε παρακάτω η perl είναι η ταχύτερη.
Perl v5.8.8
time perl dslperl &> /dev/null
real 0m0.158s
user 0m0.156s
sys 0m0.004s
--------------
Python 2.5.1
time python dslpython &> /dev/null
real 0m0.343s
user 0m0.336s
sys 0m0.004
--------------
PHP 5.2.5
time php -q dslphp &> /dev/null
real 0m0.410s
user 0m0.364s
sys 0m0.044s
--------------
tclsh 8.4.15
time tclsh dsltcl &> /dev/null
real 0m0.476s
user 0m0.448s
sys 0m0.016s
--------------
ruby 1.9.0
time ruby dslruby &> /dev/null
real 0m0.493s
user 0m0.468s
sys 0m0.008s
--------------
korn shell ( ksh93r )
time ksh dslbash &> /dev/null
real 0m1.464s
user 0m1.452s
sys 0m0.004s
--------------
sh
time sh dslsh &> /dev/null
real 0m2.373s
user 0m1.892s
sys 0m0.268s
--------------
bash 3.2.25
time bash dslbash &> /dev/null
real 0m8.405s
user 0m8.197s
sys 0m0.196s
--------------
top
[link2] https://wiki.ebal.gr/dslpython
[link3] https://wiki.ebal.gr/dslphp
[link4] https://wiki.ebal.gr/dsltcl
[link5] https://wiki.ebal.gr/dslruby
[link6] https://wiki.ebal.gr/dslbash
[link7] http://www.ilug.gr/