Comparazione delle prestazione nell'utilizzo di stringhe

Se ritieni utile questo articolo, considera la possibilitÓ di effettuare una donazione (il cui importo Ŕ a tua completa discrezione) tramite PayPal. Grazie.

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

Visualizzazione grafica delle performance registrate

La prossima figura mostra lo stesso grafico ma con l'asse dei tempi (Y) in scala logaritmica:

Visualizzazione grafica delle performance registrate con i tempi 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