Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 6 su 6

ottimizzazione

  1. #1
    L'avatar di muttley005
    muttley005 non  in linea Topo di biblioteca
    Premetto che a scopo didattico.

    ultimamente alcuni 3D hanno trattato l' argomento ottimizzazione ... e siccome questo mi ha fatto riflettere sulle mie abitudini mi sono posto l'obbiettivo di provare a migliorare anche in questo...
    e ho subito una domanda probabilmente scontata ma a cui io non so dare risposta.

    Dato per acquisito che le funzioni standard rispetto alle relative col $ (es: Dir/Dir$ , Mid/Mid$, ...) restituiscono un variant invece di una stringa per cui se devo assegnare il risultato ad una variabile stringa + performante utilizzare la funzione col $ per evitare una conversione implicita... la domanda :
    ma se io ho ad esempio:
    dim i as byte
    i=Right("Tipologia1",1)
    
    questo significa che Right mi restituisce un variant che viene convertito implicitamente in un byte

    se invece scrivessi:
    dim i as byte
    i=Int(Right$("Tipologia1",1))
    
    cambierebbe qualcosa? uguale? peggio? meglio?
    a sensazione direi uguale ... se non peggiore.

    e poi... in questo specifico caso meglio Int o CInt ?

    EDIT: a me viene sempre da mettere Int ma direi meglio CInt perch Int prende la parte intera di un numero mentre CInt converte "qualcosa" in un numero.
    quindi in realt mettendo Int fa una doppia operazione, quella implicita di conversione da stringa/variant a numero e poi prende la parte intera (quindi inutile) ... giusto?
    Ultima modifica di muttley005; 22-09-2015 19:50 

  2. #2
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    Quote Originariamente inviato da muttley005 Visualizza il messaggio
    Premetto che a scopo didattico.

    ultimamente alcuni 3D hanno trattato l' argomento ottimizzazione ... e siccome questo mi ha fatto riflettere sulle mie abitudini mi sono posto l'obbiettivo di provare a migliorare anche in questo...
    e ho subito una domanda probabilmente scontata ma a cui io non so dare risposta.

    Dato per acquisito che le funzioni standard rispetto alle relative col $ (es: Dir/Dir$ , Mid/Mid$, ...) restituiscono un variant invece di una stringa per cui se devo assegnare il risultato ad una variabile stringa + performante utilizzare la funzione col $ per evitare una conversione implicita... la domanda :
    ma se io ho ad esempio:
    dim i as byte
    i=Right("Tipologia1",1)
    
    questo significa che Right mi restituisce un variant che viene convertito implicitamente in un byte
    Frena... il tentativo di conversione in BYTE viene fatta solo perch [i] BYTE non perch RIGHT Variant...!
    L'esempio che hai fatto troppo perfetto, sostituisci al NUMERO di CHAR, attualmente 1, ad esempio 2
    i=Right("Tipologia1",2)
    
    RIGHT sempre variant... ma [i] non accetta di certo l'assegnazione [a1]... e restituisce errore...!
    Quindi quello che hai scritto un errore sostanziale.
    Quote Originariamente inviato da muttley005 Visualizza il messaggio
    se invece scrivessi:
    dim i as byte
    i=Int(Right$("Tipologia1",1))
    
    cambierebbe qualcosa? uguale? peggio? meglio?
    a sensazione direi uguale ... se non peggiore.

    e poi... in questo specifico caso meglio Int o CInt ?

    EDIT: a me viene sempre da mettere Int ma direi meglio CInt perch Int prende la parte intera di un numero mentre CInt converte "qualcosa" in un numero.
    quindi in realt mettendo Int fa una doppia operazione, quella implicita di conversione da stringa/variant a numero e poi prende la parte intera (quindi inutile) ... giusto?
    CInt ed Int sono 2 cose differenti.
    La prima effettua una CONVERSIONE ESPLICITA evitando ad Access di effettuare la conversione IMPLICITA quando la variabile [i] diversa da quanto restituito dalla Funzione... che poi una Variabile Byte di fatto possa rappresentare valori senza segno e senza virgola 0255 tutt'altro...
    La seconfa[Int] prende la parte INTERA... indipendentemente dal BYTE... poi il tentativo di conversione avviene uguale...
    ℹ️ Leggi di pi su @Alex ...

  3. #3
    L'avatar di muttley005
    muttley005 non  in linea Topo di biblioteca
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Frena... il tentativo di conversione in BYTE viene fatta solo perch [i] BYTE non perch RIGHT Variant...!
    si certo, intendevo quello

    L'esempio che hai fatto troppo perfetto, sostituisci al NUMERO di CHAR, attualmente 1, ad esempio 2
    i=Right("Tipologia1",2)
    
    RIGHT sempre variant... ma [i] non accetta di certo l'assegnazione [a1]... e restituisce errore...!
    Quindi quello che hai scritto un errore sostanziale.
    ehm... aspetta, questo era un esempio in cui davo per scontato che ci che passo sia SEMPRE del tipo "Tipologia" e un numero ("Tipologia1", "Tipologia2",...)
    quindi il mio Right di 1 non dar mai errore e non lo considero un errore date le premesse.

    CInt ed Int sono 2 cose differenti.
    La prima effettua una CONVERSIONE ESPLICITA evitando ad Access di effettuare la conversione IMPLICITA quando la variabile [i] diversa da quanto restituito dalla Funzione... che poi una Variabile Byte di fatto possa rappresentare valori senza segno e senza virgola 0255 tutt'altro...
    La seconfa[Int] prende la parte INTERA... indipendentemente dal BYTE... poi il tentativo di conversione avviene uguale...
    si mi ero corretto nell'EDIT infatti.

    Ma forse non mi sono fatto capire bene... riproviamo ...
    avendo una stringa mySTRING con possibili valori "Tipo1", "Tipo2", ... "Tipo9", volendo assegnare ad una variabile byte myBYTE il valore del carattere di destra di mySTRING quale codice + performante?
    In quel senso di getto a me verrebbe il mio primo codice
    myBYTE=Right(mySTRING,1)
    
    ma forse c' di meglio...
    tipo questo?
    myBYTE=CInt(Right$(mySTRING,1))
    

  4. #4
    L'avatar di muttley005
    muttley005 non  in linea Topo di biblioteca
    mi autorispondo ... in effetti potevo farla prima sta prova... scusate

    anche solo provando questo
    Function prova1()
    Dim i As Long, ii As Integer
        Debug.Print Time
        For i = 1 To 10000000
            ii = Right("provadirightdistringa1", 1)
        Next i
        Debug.Print Time
    End Function
    
    Function prova2()
    Dim i As Long, ii As Integer
        Debug.Print Time
        For i = 1 To 10000000
            ii = CInt(Right$("provadirightdistringa1", 1))
        Next i
        Debug.Print Time
    End Function
    
    ok... il debug.print time non un buon misuratore di tempo lo so, era per fare una cosa al volo.
    per in effetti la differenza di prestazioni significativa su un ciclo cos lungo.
    sul mio notebook prova1 impiega circa 4,5 secondi mediamente
    mentre prova2 impiega 2,5 secondi mediamente


    EDIT: inizier a fare uso massiccio di conversioni esplicite ed uso delle funzioni col $ dove possibile

  5. #5
    L'avatar di @Alex
    @Alex non  in linea Moderatore Globale
    La conversione ESPLICITA pi efficeinte perch non deve fare tentativi... tu sai quale Type stai trattando e l'azione non viene Valutata...
    Omettere la conversione richiede che il sistema valuti il Dato di Partenza e quellod i Destinazione, essendo Variant inizia a fare i suoi tentativi...
    ℹ️ Leggi di pi su @Alex ...

  6. #6
    L'avatar di muttley005
    muttley005 non  in linea Topo di biblioteca
    ok, grazie per la spiegazione

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Ottimizzazione programma c++
    Da mason89 nel forum C/C++
    Risposte: 1
    Ultimo Post: 22-05-2015, 11:56
  2. Anomalia ottimizzazione?
    Da vbExtreme nel forum C/C++
    Risposte: 19
    Ultimo Post: 29-10-2013, 20:18
  3. Ottimizzazione codice VBA
    Da mbt6 nel forum Microsoft Excel
    Risposte: 7
    Ultimo Post: 12-05-2013, 20:18
  4. Ottimizzazione codice
    Da help48 nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 16-11-2010, 15:04
  5. Ottimizzazione connessione
    Da pingonez nel forum Networking e sicurezza
    Risposte: 1
    Ultimo Post: 14-02-2006, 10:17