Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Da vb.Net a c#.net

  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    Da vb.Net a c#.net

    Ho questa piccola sobroutine in basic
    codice:
    Private a$ = "Essere o non essere, questo è il problema"
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    	Dim i% = 0, k% = 1000000
    	Dim StartTime, EndTime As DateTime
    	Dim Tempo As TimeSpan
    	Dim Secondi, MilliSecondi As Double
    	Dim rand As New Random(CInt(Date.Now.Ticks And Integer.MaxValue))
    
    	StartTime = Now
    	For i = 1 To k
    		Dim x% = rand.Next(1, Len(a) + 1)
    		Dim s$ = Left(a, x)
    	Next
    	EndTime = Now
    	Tempo = EndTime.Subtract(StartTime)
    	MilliSecondi = Tempo.Ticks / 10000
    	PrintLn(MilliSecondi, "Millesecondi (basic))")
    
    End Sub
    Lanciando la pagina e cliccando sul pulsante ottengo questi 5 risultati:
    453
    453
    422
    406
    422
    422


    Adesso converto la procedura in c#
    codice:
    	string a = "Essere o non essere, questo è il problema";
    	
    	private void Button1_Click(object sender, System.EventArgs e)
    	{
    		System.Int32 i = 0, k = 1000000;
    		DateTime StartTime, EndTime;
    		TimeSpan Tempo;
    		System.Double MilliSecondi;
    		Random rand = new Random((Int32)(DateTime.Now.Ticks & Int32.MaxValue));
    
    		StartTime = DateTime.Now;
    		for( i = 1; i <= k; i++)
    		{
    			Int32 x = rand.Next(0, a.Length);
    			String s = a.Substring(0, x);
    		}
    		EndTime = DateTime.Now;
    		Tempo = EndTime.Subtract(StartTime);
    		MilliSecondi = Tempo.Ticks / 10000;
    		Response.Write(MilliSecondi);
    
    	}
    ed ottengo:
    515
    515
    546
    500
    500
    500


    Siccome mi aspetto di ottenere in c# valori inferiori a quelli ottenuti in basic, presumo che abbia tradotto male il codice :master:
    Mi potreste aiutare per favore?

    Pietro

  2. #2
    Questo codice l'ho già visto!

    Una domanda: ma "a" che cosa contiene?

    La differenza di prestazioni può essere dovuto dal fatto che ogni esecuzione crea un numero casuale per prendere "x" caratteri da "a" (vedi istruzioni Rand).

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da AndreaZani
    Questo codice l'ho già visto!

    Una domanda: ma "a" che cosa contiene?

    La differenza di prestazioni può essere dovuto dal fatto che ogni esecuzione crea un numero casuale per prendere "x" caratteri da "a" (vedi istruzioni Rand).

    Ciao
    :master: Sono un po' confuso. Io cercavo solo di mettere in pratica i tuoi suggerimenti: ti prego e riprego, dimmi che ho sbgliato il codice c# DEVE ESSERE SBAGLIATO PER FORZA

    Ciao
    Pietro

  4. #4
    Come ti ho risposto nell'altro thread, le differenze tra l'istruzione left e Substring e minima, visto che il compilatore Visual Basic converte il suo comando nell'equivalente "String.Left" che a sua volta utilizza un "Substring".

    Nel tuo caso il calcolo di prestazioni non può essere molto preciso per due fattori:
    [list=1][*]Utilizzi numeri random per prelevare un numero "x" di caratteri.[*]Il conteggio con il DateTime non è molto preciso: ti consiglio l'utilizzo dell'ApplicationTester presente in Visual Studio per test più precisi.[/list=1]
    Appena posso, provo il tuo codice.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ho visualstudio 2003, ma non conosco ApplicationTester

    Puoi scrivere due righe su come usarlo?


    ps. Per la misura dei tempi usi per caso le api di windows?
    Pietro

  6. #6
    Originariamente inviato da pietro09
    Ho visualstudio 2003, ma non conosco ApplicationTester
    Non so da quale versione è presente in Visual Studio, ma è tra i tool che puoi installare.
    Puoi scrivere due righe su come usarlo?
    Si basa tutto si file vbscript o jscript, e puoi fare in modo di richiamare delle tue pagine della tua webapplication in modo da simulare le pagine visitate teoricamente da un visitatore. Inoltre permette di simulare l'accesso a X utenti contemporanei anche se questa opzione è utilizzabile solo sui windows versione server visto che la limitazione delle 10 connessioni contemporanee di windows xp o windows 2000 chiude questa possibilità di test reali.
    ps. Per la misura dei tempi usi per caso le api di windows?
    No, mai provete! Uso quando voglio una certa precisione l'application tester perché permette una simulazione abbastanza veritiera di possibili casi reali.

    Con le API di windows come fai i test?

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    andrea, mi sembra ke non tutte le versioni di vs .net 2003 abbiano quello ke tu dici .. cioè da quanto ho capito ci sono 3 versioni di vs (pro, architect e developer (non sono sicuro dei nomi)) e la versione base (ke non so quale sia..) non ha questo programma .. forse è x questo ke pietro nn trova niente..

  8. #8
    Ho provato il tuo codice, ma l'ho modificato perché non utilizzasse valori casuali che potevano compromettere le prestazioni. Per valutare le prestazioni qui inserisco il codice che usa il Trace per semplificare.

    Il primo esempio è basato sul VB con l'uso del Left:
    codice:
    <%@ Page language="vb" trace="true" strict="true"%>
    <script runat="server">
    sub Page_load()
    	dim a as string= "Essere o non essere, questo è il problema"
            Trace.Write("Inizio")
            Dim i as integer = 0
    	dim k as integer = 1000000
            Dim kk as integer = 1
            For i = 1 To k
                Dim s as string = Left(a, kk)
                kk = kk + 1 : If kk > a.Length Then kk = 1
            Next
            Trace.Warn("Fine")
    end sub
    </script>VB.net
    Il secondo sul C#:
    codice:
    <%@ Page language="c#" trace="true"%>
    <script runat="server">
    void Page_load()
    {
    	string a = "Essere o non essere, questo è il problema";
            Trace.Write("Inizio");
    	int i = 0, k = 1000000;
    	int kk=1;
    	for( i = 1; i <= k; i++)
    	{
    		String s = a.Substring(0, kk);
    		kk+=1;if (kk>a.Length) kk=1;
    	}
            Trace.Warn("Fine");}
    </script>C#
    I tempi sul mio PC sono stati i seguenti:
    [list=a][*]VB: 0,160061[*]C#: 0,127796[/list=a]Anche se minima c'è una differenza che sparisce nel caso del codice VisualBasic che usa direttamente il Substring:
    codice:
    <%@ Page language="vb" trace="true" strict="true"%>
    <script runat="server">
    sub Page_load()
    	dim a as string= "Essere o non essere, questo è il problema"
            Trace.Write("Inizio")
            Dim i as integer = 0
    	dim k as integer = 1000000
            Dim kk as integer = 1
            For i = 1 To k
                Dim s as string = a.Substring(0,kk)
                kk = kk + 1 : If kk > a.Length Then kk = 1
            Next
            Trace.Warn("Fine")
    end sub
    </script>VB.net
    E' minimo il vantaggio, ma seppur minimo...

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  9. #9
    Stavo leggendo ora il codice prodotto dai compilatori per le varie versioni esposte qui sopra.

    Semplificando, con il "Left" viene eseguita la funzione "Left" presente nella classe "Strings" in "Microsoft.VisualBasic.dll". La funzione "Left" ha questo codice:
    codice:
    Public Shared Function Left(ByVal str As String, ByVal Length As Integer) As String
          If (Length < 0) Then
                Throw New ArgumentException(Utils.GetResourceString("Argument_GEZero1", "Length"))
          End If
          If ((Length = 0) OrElse (str Is Nothing)) Then
                Return ""
          End If
          If (Length >= str.Length) Then
                Return str
          End If
          Return str.Substring(0, Length)
    End Function
    Come vedi, viene ancora richiamato alla fine il metodo Substring con molti passaggi in più che il richiamo diretto della stessa, ed è qui il degrado di prestazione.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.