Εδώ όμως θα με απασχολήσει κάτι άλλο. Αυτό που ενδιαφέρθηκα να μάθω είναι ο χρόνος που απαιτείται για το parsing ενός μεγάλου όγκου κώδικα από τον browser. Η mini-εφαρμογή που θέλησα να φτιάξω έχει την ιδιαιτερότητα ότι δεν προορίζεται για web σελίδα. Θα τρέχει ως κανονική Windows εφαρμογή στον browser του χρήστη, χωρίς την ανάγκη να είναι συνδεδεμένος στο Internet. Η εφαρμογή είναι μία απλή database με αρκτικόλεξα που δίνει στο χρήστη τη δυνατότητα να γράψει π.χ. τη λέξη PNG και να πάρει την απάντηση "Portable Network Graphics". Η εφαρμογή πρέπει να τρέχει σε όλους τους browsers, επομένως τα ActiveX είναι εκτός συζήτησης. Εάν λοιπόν δεν υπάρχει δυνατότητα για μία συμβατική SQL database, η αποθήκευση των αρκτικόλεξων πρέπει να γίνει εξ'ολοκλήρου με JavaScript. Όμως η γλώσσα αυτή δεν έχει φτιαχτεί για πολύ μεγάλο φόρτο, και επομένως έχει σημασία να βρεθεί η πιο αποδοτική από τις διαθέσιμες επιλογές. Στόχος μου ήταν να έχω μία database με 10.000 περίπου εγγραφές, και η σελίδα να φορτώνεται και να εμφανίζει τα αποτελέσματα σε λιγότερο από 200msec σε ένα μηχάνημα Celeron 2.4. Αυτός ο χρόνος αφορά το parsing του κώδικα, και όχι το κατέβασμά του από το Internet ή το χρόνο εκκίνησης του browser, ο οποίος πρέπει να είναι ήδη ανοιχτός. Παρακάτω περιγράφω τους τρεις τρόπους που δοκίμασα, και την απόδοση του καθενός από αυτούς σε τρeις browsers (Firefox, Opera, Internet Explorer).
1) Αντικείμενα JavaScript. Η πρώτη και πιο κομψή προσπάθεια. Τα προβλήματα απόδοσης που συνάντησα ήταν η αφορμή για αυτές τις δοκιμές. Ο κώδικας είναι ο εξής:
Code: Select all
function Acronym(name, value) {
this.name = name
this.value = value
}
var acronym_list = []
acronym_list.add = function(name, value) {
this.push(new Acronym(name, value))
}
acronym_list.search = function(name) {
var re_text = new RegExp("^" + name + "$", "i")
for (var i = 0; i < this.length; i++) {
if (re_text.test(this[i].name)) return this[i]
}
}
with(acronym_list) {
add("PNG", "Portable Network Graphics")
add("SQL", "Structured Query Language")
// Συν πολλές ακόμα εγγραφές.
}
Code: Select all
Firefox 1.0 (5.000 εγγραφές) : 280, 40
Firefox 1.0 (10.000 εγγραφές) : 480, 130
Opera 8.0 (5.000 εγγραφές) : 300, 35
Opera 8.0 (10.000 εγγραφές) : 700, 70
IE 6.0 (5.000 εγγραφές) : 530, 35
IE 6.0 (10.000 εγγραφές) : 1.480, 70
Code: Select all
acronym_list.add("PNG", "Portable Network Graphics")
acronym_list.add("SQL", "Structured Query Language")
// Συν πολλές ακόμα εγγραφές.
Code: Select all
with(acronym_list) {
push(new Acronym("PNG", "Portable Network Graphics"))
push(new Acronym("SQL", "Structured Query Language"))
// Συν πολλές ακόμα εγγραφές.
}
Code: Select all
acronym_list.load = function() {
this.add("PNG", "Portable Network Graphics")
this.add("SQL", "Structured Query Language")
// Συν πολλές ακόμα εγγραφές.
}
Code: Select all
Firefox 1.0 (5.000 εγγραφές) : 1.300, 40
Firefox 1.0 (10.000 εγγραφές) : 4.500, 130
2) Array συμβολοσειρών. Κάθε αρκτικόλεξο αποθηκεύεται σε ένα string:
Code: Select all
var acronym_list = []
acronym_list.add = function(str) {
this.push(str)
}
acronym_list.search = function(name) {
var re_name = new RegExp().compile("^" + name + ";", "i")
var re_value = new RegExp(";(.*)$")
for (var i = 0; i < this.length; i++) {
if (re_name.test(this[i])) return this[i].match(re_value)[1]
}
}
with(acronym_list) {
add("PNG;Portable Network Graphics")
add("SQL;Structured Query Language")
// Συν πολλές ακόμα εγγραφές.
}
Code: Select all
Firefox 1.0 (5.000 εγγραφές) : 150, 150
Firefox 1.0 (10.000 εγγραφές) : 260, 400
Opera 8.0 (5.000 εγγραφές) : 300, 70
Opera 8.0 (10.000 εγγραφές) : 600, 140
IE 6.0 (5.000 εγγραφές) : 170, 30
IE 6.0 (10.000 εγγραφές) : 320, 60
3) Όλα τα δεδομένα σε ένα μοναδικό string:
Code: Select all
search = function(name) {
var re_entry = new RegExp("#" + name + ";(.*?)#", "i")
var match = acronym_list.match(re_entry)
if (match) return match[1]
}
var acronym_list = "#PNG;Portable Network Graphics#SQL;Structured Query Language#"
// Συν πολλές ακόμα εγγραφές.
Code: Select all
Firefox 1.0 (5.000 εγγραφές) : 90, 30
Firefox 1.0 (10.000 εγγραφές) : 150, 40
Opera 8.0 (5.000 εγγραφές) : 280, 70
Opera 8.0 (10.000 εγγραφές) : 290, 140
IE 6.0 (5.000 εγγραφές) : 90, 5
IE 6.0 (10.000 εγγραφές) : 120, 10
Code: Select all
var acronym_list = "#" +
"PNG;Portable Network Graphics#" +
"SQL;Structured Query Language#"
// Συν πολλές ακόμα εγγραφές.
Code: Select all
Firefox 1.0 (5.000 εγγραφές) : 140, 20
Firefox 1.0 (10.000 εγγραφές) : 210, 40
Opera 8.0 (5.000 εγγραφές) : 280, 70
Opera 8.0 (10.000 εγγραφές) : 290, 140
IE 6.0 (5.000 εγγραφές) : κόλλησε!
IE 6.0 (10.000 εγγραφές) : κόλλησε!