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

Discussione: Funzione lenta

Hybrid View

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

    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,743
    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,743
    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,809
    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,103
    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,743
    :-) 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
    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

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,743
    Quote Originariamente inviata da sspintux Visualizza il messaggio
    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;
    se è così allora sulla luna ci siamo arrivati per culo, perchè nel '69 gli elaboratori ciclavano a velocità bassa e la generazione di un numero casuale riusciva sempre
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  10. #10
    Quote Originariamente inviata da supermac Visualizza il messaggio
    se è così allora sulla luna ci siamo arrivati per culo,
    il fattore Q non guasta mai

    cmq, qua https://docs.microsoft.com/it-it/dot...e-3.1#Multiple dice :

    Evitare più creazioni di istanze

    Nel .NET Framework, l'inizializzazione di due generatori di numeri casuali in un ciclo stretto o in successione rapida crea due generatori di numeri casuali che possono produrre sequenze identiche di numeri casuali. Nella maggior parte dei casi, non si tratta dello scopo dello sviluppatore e può causare problemi di prestazioni, perché la creazione di un'istanza e l'inizializzazione di un generatore di numeri casuali è un processo relativamente costoso.

    poi ... boh ...
    credo che ci sia stato anche qualche modifica passando al .net core

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