Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Funzione lenta

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,734

    Funzione lenta

    Buonasera a tutti
    ho una funzioncina che mi genera una stringa con un colore rgba casuale.
    Questa funzioncina la lancio in un ciclo nel quale sfoglio un datatable e assegno ad ogni record un colore rgba diverso.
    Bene, mi succede che se eseguo in debug i vari passi del ciclo va tutto bene e trovo in ogni record del datatable un colore diverso ma quando gira per conto suo trovo in datatable tutti i record lo stesso colore...
    Che ho scritto un ciclo "col ciclo"?


    codice:
    protected sub sfoglia(byref dtt as datatable)
                For Each row In dtt.Rows
                   row!opcolore = HexColGenerator(0.3)
                Next
    end sub
    
     Public Shared Function HexColGenerator(ByVal Optional alpha As Decimal = 1) As String
          Dim intR, intG, intB As Integer
          Dim RandomClass As New Random()
          Dim strColor As String = ""
    
          intR = RandomClass.Next(0, 256)
          intG = RandomClass.Next(0, 256)
          intB = RandomClass.Next(0, 256)
         
         RandomClass = Nothing
    
          If alpha < 1 Then
             strColor = "rgba(" & intR.ToString & "," & intG.ToString & "," & intB.ToString & "," & Int(alpha * 255).ToString & ")"
          Else
    
             Dim hexR, hexG, hexB As String
             hexR = intR.ToString("X").PadLeft(2, "0"c)
             hexG = intG.ToString("X").PadLeft(2, "0"c)
             hexB = intB.ToString("X").PadLeft(2, "0"c)
    
    
             strColor = "#" & hexR & hexG & hexB
          End If
          intR = Nothing
          intG = Nothing
          intB = Nothing
    
          Return strColor
       End Function
    W la Ferari effetrenavenave!
    il computer un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,734
    Pi veloce del previsto: se la Randomclass la dichiaro fuori dalla funzione come public shared e non la creo e distruggo dentro la funzione funziona.
    Mah...
    W la Ferari effetrenavenave!
    il computer un somaro veloce! (neanche tanto ndr)

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,734
    PS la funzioncina ha anche un errore, l'alpha non va convertito in scala da 0 a 255 come ho fatto io ma va usato com'
    W la Ferari effetrenavenave!
    il computer un somaro veloce! (neanche tanto ndr)

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,801
    due domande:

    1. cosa row!opcolore ?

    2. perche' distruggi la RandomClass ? Sono molte righe ?


    comunque, hai provato a NON passare il datatable per riferimento ?

  5. #5
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,094
    Per la classe random devi usare il seed quando la inizializzi in modo da generare valori pseudoicasuali.
    Per il resto creare e distruggere la classe random come detto sopra potrebbe darti problemi di garbagecollector a lungo andare, passalo alla funzione.

  6. #6

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,734
    :-) In effetti era questione di SEED.
    Creando la RandomClass ogni volta nella funzione senza fargli il reseed proponeva sempre lo stesso valore ad ogni ciclo, mettendola invece public e passandola alla funzione il problema non si pone.

    row!opcolore un campo del datatable che valorizzo con la funzione: il datatable DEVO passarlo byref perch lo genero da tutt'altra parte (anyway ha si e no 20 records non un oggetto tanto "grasso" da maneggiare)

    "Lenta" perch nel panico in cui ero piombato ero arrivato a pensare che proponesse sempre lo stesso valore rgb perch il ciclo era pi veloce della generazione casuale dei valori!!! sono scemo lo so, tendo a umanizzare le macchine.
    W la Ferari effetrenavenave!
    il computer un somaro veloce! (neanche tanto ndr)

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,801
    il datatable puo' avere un campo che si chiama

    row!opcolore ? (intendo con il punto esclamativo)

    mi sembra una BAD practices

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,734
    codice:
    For Each row In dtt.Rows
        row!opcolore = HexColGenerator(0.3)
    Next
    row una datarow.
    opcolore il nome di colonna... why bad practice?
    La bad practice semmai non aver specificato il tipo e aver usato "row" come nome della mia datarow... per fare i pignoli avrei dovuto scriverlo cos
    codice:
    For Each miodr as datarow In dtt.Rows
        miodr!opcolore = HexColGenerator(0.3)
    Next
    W la Ferari effetrenavenave!
    il computer un somaro veloce! (neanche tanto ndr)

  10. #10
    Quote Originariamente inviata da supermac Visualizza il messaggio
    :-)
    ....
    nel panico in cui ero piombato ero arrivato a pensare che proponesse sempre lo stesso valore rgb perch il ciclo era pi veloce della generazione casuale dei valori!!!
    ....
    IMHO, nel panico ci avevi preso perch

    1)
    essendo l'algoritmo di generazione pseudocausale basato sull'ora corrente
    la generazione di valori casuali con diverse istanze di randomclass create a brevissima distanza di tempo
    di fatto portava a valori uguali a quelli della precedente istanza;

    2)
    la creazione di n istanze di randomclass invece di una sola ha il suo peso e rallenta il tutto

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 © 2020 vBulletin Solutions, Inc. All rights reserved.