Comparazione delle prestazione nell'utilizzo di stringhe
Verranno prese in esame 7 diverse implementazioni relative alla concatenazione ciclica di stringhe, verificando per ciascun caso i tempi di elaborazione richiesti ed incrementando il numero di concatenazioni da 200 fino a 100.000; in ogni ciclo dovrà essere accodata la stringa "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ".
A - concatenazione pura di stringhe in JScript
Implementato come di seguito:
<%@Language="JScript"%>
<html>
<body>
<%
var loops = 200;
var txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
var t = new Date().getTime();
var s = "";
for(var i = 1; i < loops; i++)
s += txt;
Response.Write(s);
Response.Write("<hr>Tempo esecuzione " + loops + " cicli: " + ((new Date().getTime()) - t) + " ms");
%>
</body>
</html>
B - utilizzo ripetuto di Response.Write in JScript
Implementato come di seguito:
<%@Language="JScript"%>
<html>
<body>
<%
var loops = 200;
var txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
var t = new Date().getTime();
for(var i = 1; i < loops; i++)
Response.Write(txt);
Response.Write("<hr>Tempo esecuzione " + loops + " cicli: " + ((new Date().getTime()) - t) + " ms");
%>
</body>
</html>
C - utilizzo di array in JScript
Implementato come di seguito:
<%@Language="JScript"%>
<html>
<body>
<%
var loops = 200;
var txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
var t = new Date().getTime();
var a = new Array();
for(var i = 1; i < loops; i++)
a[a.length] = txt;
Response.Write(a.join(""));
Response.Write("<hr>Tempo esecuzione " + loops + " cicli: " + ((new Date().getTime()) - t) + " ms");
%>
</body>
</html>
D - concatenazione pura di stringhe in VBScript
Implementato come di seguito:
<%@Language="VBScript"%>
<%
Option Explicit
%>
<html>
<body>
<%
Dim loops
Dim txt
Dim t
Dim i
loops = 200
txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
t = Timer()
Dim s
s = ""
For i = 1 To loops
s = s & txt
Next
Response.Write(s)
Response.Write("<hr>Tempo esecuzione " & loops & " cicli: " & Round((Timer() - t)*1000, 0) & " ms")
%>
</body>
</html>
E - utilizzo ripetuto di Response.Write in VBScript
Implementato come di seguito:
<%@Language="VBScript"%>
<%
Option Explicit
%>
<html>
<body>
<%
Dim loops
Dim txt
Dim t
Dim i
loops = 200
txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
t = Timer()
For i = 1 To loops
Response.Write(txt)
Next
Response.Write("<hr>Tempo esecuzione " & loops & " cicli: " & Round((Timer() - t)*1000, 0) & " ms")
%>
</body>
</html>
F - utilizzo di array in VBScript
Implementato come di seguito:
<%@Language="VBScript"%>
<%
Option Explicit
%>
<html>
<body>
<%
Dim loops
Dim txt
Dim t
Dim i
loops = 200
txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
t = Timer()
Dim a
a = Array()
For i = 1 To loops
ReDim Preserve a(Ubound(a) + 1)
a(UBound(a)) = txt
Next
Response.Write(Join(a, ""))
Response.Write("<hr>Tempo esecuzione " & loops & " cicli: " & Round((Timer() - t)*1000, 0) & " ms")
%>
</body>
</html>
G - utilizzo di array (precedentemente dimensionato) in VBScript
Implementato come di seguito:
<%@Language="VBScript"%>
<%
Option Explicit
%>
<html>
<body>
<%
Dim loops
Dim txt
Dim t
Dim i
loops = 200
txt = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "
t = Timer()
Dim a
a = Array(loops)
ReDim a(loops)
For i = 0 To loops
a(i) = txt
Next
Response.Write(Join(a, ""))
Response.Write("<hr>Tempo esecuzione " & loops & " cicli: " & Round((Timer() - t)*1000, 0) & " ms")
%>
</body>
</html>
Risultati
La tabella seguente mostra il dettaglio dei tempi di esecuzione (espressi in millisecondi) rilevati:
| loop | A | B | C | D | E | F | G |
| 200 * | 10 | 0 | 0 | 0 | 0 | 0 | 0 |
|---|---|---|---|---|---|---|---|
| 500 | 30 | 10 | 0 | 31 | 0 | 0 | 0 |
| 1000 | 100 | 10 | 0 | 78 | 0 | 8 | 0 |
| 1500 | 271 | 20 | 10 | 200 | 0 | 20 | 12 |
| 2000 | 701 | 20 | 20 | 629 | 8 | 23 | 12 |
| 2500 | 1332 | 30 | 20 | 1145 | 8 | 39 | 12 |
| 3000 | 2083 | 40 | 30 | 1961 | 8 | 50 | 19 |
| 3500 | 3204 | 40 | 40 | 3145 | 12 | 50 | 19 |
| 4000 | 4716 | 40 | 40 | 4855 | 12 | 78 | 19 |
| 4500 | 6309 | 50 | 60 | 6398 | 12 | 98 | 31 |
| 5000 | 8633 | 50 | 60 | 8785 | 20 | 109 | 31 |
| 5500 | 10666 | 60 | 70 | 11145 | 20 | 121 | 39 |
| 6000 | 13039 | 70 | 80 | 13680 | 20 | 128 | 42 |
| 6500 | 16073 | 70 | 80 | 17043 | 20 | 148 | 43 |
| 7000 | 18958 | 80 | 90 | 20086 | 20 | 152 | 43 |
| 7500 | 22502 | 80 | 90 | 23605 | 20 | 160 | 43 |
| 8000 | 26228 | 90 | 100 | 27551 | 20 | 238 | 46 |
| 8500 | 29993 | 100 | 110 | 31996 | 27 | 242 | 50 |
| 9000 | 33809 | 100 | 120 | 36102 | 31 | 257 | 58 |
| 9500 | 38155 | 100 | 120 | 40551 | 31 | 280 | 62 |
| 10000 | 43292 | 110 | 130 | 46746 | 31 | 280 | 62 |
| 50000 * | > 90000 | 470 | 651 | > 90000 | 160 | 3074 | 351 |
| 100000 * | > 90000 | 951 | 1412 | > 90000 | 250 | 5257 | 703 |
La figura seguente presenta i valori della tabella in formato grafico.
NOTA: le righe contrassegnate con * non verranno considerate nella rappresentazione grafica
La prossima figura mostra lo stesso grafico ma con l'asse dei tempi (Y) in scala logaritmica:
Conclusioni
La soluzione 1 (normale concatenazione di stringhe) risulta essere la più onerosa, con una crescita esponenziale dei tempi di esecuzione all'aumentare della dimensione della stringa manipolata.
La soluzione 2 (Response.Write) non risulta sempre possibile (ad esempio qualora lo scopo della concatenazione non sia inviarne il risultato al client), seppur offra elevate prestazioni.
La soluzione 3 (Utilizzo di Array) permette le stesse potenzialità della normale concatenazione di stringhe ma risulta molto più efficiente, permettendo ottime e costanti performance anche all'aumentare delle dimensioni della stringa trattata.
I risultati sono indipendenti dal linguaggio (VBScript o JScript) utilizzato