Comparison of Scripting Languages
Contents
Overview
Στην δουλειά μας χρειάζεται αρκετές φορές να αναπτύξουμε ένα νέο πρόγραμμα ή να
τροποποιήσουμε κάποιο ήδη υπάρχον. Η επιλογή της γλώσσας προγραμματισμού σχεδόν πάντα
έχει μοναδικό κριτήριο το πόσο καλά εξοικειωμένοι είμαστε με αυτήν. Όμως μερικά κριτήρια
που θα πρέπει να έχουμε στο μυαλό μας είναι τα εξής:
- Εξοικείωση
- Ταχύτητα Εκτέλεσης
- Δυνατότητα βελτιστοποίησης
- Δυνατότητα Επαναχρησιμοποίησης
- Δυνατότητα Διεπαφής
Στην προσπάθειά μου να βρω ποια scripting language θα ήταν "καλύτερη" για την ανάπτυξη ενός
προβλήματος που είχα, αφιέρωσα λίγο χρόνο ώστε να γράψω ένα πρόγραμμα σε διάφορες scripting
languages και να παράγω μερικές χρήσιμες μετρήσεις.
Αλγόριθμος
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
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 Γιώργο.
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 --------------