Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET - lunghetto] vs VB6 Prestazioni funzione space()

Ciao a tutti.
Mi sto dilettando nello studio di 
VB.NET
 e cerco, per quanto possibile di
fare dei raffronti prestazionali con VB6.
Oggi ho eseguito qualche test su cicli for con operazioni tra numeri e tra
stringhe.
Mentre nel caso di calcoli mi sembra che .NET si comporti meglio,
con le stringhe (o almeno con alcune funzioni che trattano stringhe) zoppica
un po, anche se è più probabile zoppichi io in .NET e quindi faccia qualche
test in modo non consono.
Vorrei sapere che ne pensate di questi dati ed eventuali suggerimenti.
Codice VB6 e .NET
dim i as integer, s as string
[acquisisco tempo]
for i =0 to 50000
    s=space(i)
next
[acquisisco tempo]
con VB6 1,242 sec con 
VB.NET
 8,903
++++++++++++++++++++++++++++++++
[acquisisco tempo]
for i =0 to 50000000 (cinquantamilioni)
    s=space(N)
next
[acquisisco tempo]
Per N=500
con VB6 3,625 sec con 
VB.NET
 10,205
Per N=50
con VB6 2,213 sec con 
VB.NET
 2,133
Per N=5
con VB6 2,073 sec con 
VB.NET
 1,312
+++++++++++++++++++++++++++++++++
Quindi sembrerebbe che la funzione Space() con VB6 sia implementata in un
modo e in .NET in un altro, con un vantaggio del del primo con numeri grandi
di spazi e un vantaggio del secondo con numeri piccoli di spazi.
Sapreste dirmi se sto facendo il test in modo corretto oppure no e cosa ne
pensate.
Grazie a tutti
Ciao
Stefano
P.S. Il test è stato eseguito su un Athlon 900 con 384Mb Ram e Windows Xp
Professional.

 con VB6 1,242 sec con 
VB.NET
 8,903
Riprova con VB6 usando Space$ anzichč Space.
Riprova con .Net usando stringa = new System.String(" ", n) anzichč la
Microsoft.VisualBasic.Space
(n).
Fammi sapere :)
Ciao
--
using System.Gtk.Forms = "
http://www.neodatatype.net/windowsforms/sgf.aspx
"
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"

Si, credo anchi'io che la lentezza derivi dal fatto che Space() sia stata
introdotta in .NET solo per retrocompatibilità con VB6.
A proposito di "eradicazione" del namespace Microsoft.VisualBasic, come
procede la lista delle conversioni delle vecchie funzioni di VB6 con i nuovi
operatori di .NET ?
Ciao, Luca.

 operatori di .NET ?
E' rimasta pressochè invariata dall'ultimo post :)
Forso ho aggiunto un paio di noticine... adesso aggiungo questa :)
Ciao

 no e cosa ne pensate.
No, il test non è corretto. In .NET la classe System.String è
stata concepita per essere immutabile. Ciò significa che ad ogni
s=space(i) tu non assegni un nuovo valore alla stringa s, ma
crei di fatto un *nuovo* oggetto stringa, e questo non può non
avere *pesanti* ripercussioni sulle prestazioni.
Ovvero in VB6 crei *un* oggetto e fai 50.000 assegnazioni, in
VB.NET
 crei 50.000 oggetti. Se vuoi fare un raffronto corretto
devi utilizzare la classe System.Text.StringBuilder.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 devi utilizzare la classe System.Text.StringBuilder.
Ancora vero, solo che a me il StringBuilder sta proprio antipatico :P


vb6
Dim i As Long, s As String
For i = 0 To 50000
    s = Space(i)
Next
tot tempo=  1,53199999999924 sec
--------------------------------
VB.NET
1-
Dim str As System.String = New String(CChar(" "), 50000)
tot tempo = 0
2-
 Dim i As System.Int32
Dim s As New System.Text.StringBuilder()
        For i = 0 To 5000
            s.Append(
Microsoft.VisualBasic.Space
(i))
        Next
tot tempo = Secondi: 0,328
Pentuim 4 - 516 Mb ram - Windows 2000 Prof
giuseppeD


Riprovato.
in VB6 con Space$() le prestazioni migliorano abbastanza
mentre in .NET utilizzando la classe new System.String(" ", n)
le prestazioni migliorano ma quasi impercettibilmente.
In effetti come segnalato da H.P.L. poco piů giů con questo sistema si
istanziano 50.000 classi, il che diventa un po pesantuccio.
Per l'utilizo della classe segnalata da H.P.L., posto piů giů una
considerazione.
ciao
Stefano

 --
Ciao.
Ho provato ma ho trovato un piccolo intoppo, io faccio così
dim s as System.Text.StringBuilder
nel ciclio for poi posso fare
s.append (" ", N)
ma la stringa viene accodata a quella già esistente, mentre vorrei ch fosse
sostituita, l'unica soluzione che ho trovato è:
s.length=0
s.append (" ", N)
ma le prestazioni ne risentono.
Ora proverò a cercare qualcos'altro, ma se avete suggerimenti son qui a
(avidamente) "ricevere" ;-)
ciao e grazie
stefano
P.S. Per H.P.L. Scusa per il messaggio prv ma ho sbagliato nel "rispondi"

 "rispondi"
L'indirizzo è falso, quindi non mi arriva nulla.


 (avidamente) "ricevere" ;-)
Idea volante:
Dim MySpaces As String = new String(" ", n)
...
Dim MyNewString As String
Do
    MyNewString = MySpaces
Loop
Ciao

 Loop
Tanto per fare una prova:
<test>
AIDEE% cat pippo.cs
using System;
public class Prova
{
    public static void Main()
    {
        String a = "Pippo";
        String b;
        for (int i=0; i < 1000000; ++i)
        {
            b = a;
        }
    }
}
AIDEE% cat pippo1.cs
using System;
public class Prova
{
    public static void Main()
    {
        string a = "Pippo";
        string b;
        for (int i=0; i < 1000000; ++i)
        {
            b = i.ToString();
        }
    }
}
AIDEE% time mono pippo.exe
mono pippo.exe  0,04s user 0,02s system 47% cpu 0,132 total
AIDEE% time mono pippo1.exe
mono pippo1.exe  3,03s user 0,01s system 97% cpu 3,127 total
</test>
