Hits : 3721

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 και είναι
το dslbash τροποποιημένο ώστε να είναι POSIX compliant. -Thanks Fuzz


Επίσης έχω κάνει τροποποιήσεις πάνω στις παρατηρήσεις του Κεραμιδά από το παρακάτω link από το forum του hellug. -Τhanks Γιώργο.


top


Results


Μετρήσεις μπορείτε να βρείτε εδώ:
http://forum.hellug.gr/index.php?topic=623.0


Οι δικές μου μετρήσεις έγιναν σε ένα μηχάνημα με τα εξής χαρακτηριστικά:


Intel® Pentium® 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