Newsgroup: it.comp.lang.visual-basic
Titolo: velocità....passo a vc++?

ciao, sto realizzando un programma, in 
vb.net
, che effettua delle 
operazioni, su una matrice...
quando questa diventa particolarmente grossa. S'inchioda il programma.
Di pi� non posso ottimizzare, Che dite passo a visual c++ ??
Tenete presente che sto usando la versione express
ciao

 Di pi� non posso ottimizzare, Che dite passo a visual c++ ??
Di che roba si tratta pi� nello specifico?
Se posti parte di codice probabilmente qualcuno ti sapr� dire se � ancora
ottimizzabile.
Inoltre sei riuscito a capire dov'� che rallenta principalmente?

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:1aevdbkfyl5gb.n...@40tude.net...

sono due for annidati, uno gira sull'altezza della matrice e l'altro sulla 
larghezza.
diciamo che a 800*800 non ci sono problemi quando si supera i 1000....
allora si blocca! 

 allora si blocca!
Se i dati fossero ordinati per esempio si potrebbe usare qualche algoritmo
di ricerca nella matrice.
Insomma tu  scorri questa matrice per far cosa? Oppure ricerchi qualcosa
nella matrice? In tal caso la matrice ha un qualche ordine?
Comunque se vuoi provare in altro linguaggio, ti fai un programma di
esempio similare e vedi i tempi.

 esempio similare e vedi i tempi.
Infatti adesso prover� vc++
ci sono dei convertitori da 
vb.net
 a vc++? cos� faccio prima? adesso li 
cerco su google.
grazie e ciao 

 no, non posso ordinarla, la tengo cos� com'�!!!
In due risposte non sei riuscito a capire quello che intendevo. :)
Se non dici cosa fa la procedura e non posti qualche riga di codice �
impossibile per il NG capire se � ottimizzabile o meno.
Il fatto che tu pensi che non lo sia non vuol certo dire che non lo � pi�.
Cos� come accade con me e con tutti.
Per il resto in VB6 un codice del genere:
Private Sub Command1_Click()
    Dim i As Long
    Dim j As Long
    Dim Valore As Long
 
    a = Timer
 
    For i = 0 To 2000
        For j = 0 To 2000
            Valore = i * j
        Next
    Next
 
    Debug.Print "Durata: " & Timer - a
End Sub
Impiega 0.25 secondi. Con 4000*4000 circa 1 secondo.

 Impiega 0.25 secondi. Con 4000*4000 circa 1 secondo.
Ma davvero? :)
-- 
Greg 

 Cos� come accade con me e con tutti.
si questo � vero, ma di pi� non posso!
grazie 

 ognuno applica o meno un'operazione
Io lavoro su bitmap abbastanza grosse in tempi accettabili,
ma ovviamente dipende da quello che fai nel loop, e dalla tua
definizione di "accettabile". Il loop in s� � ininfluente.
In un programma faccio analisi di densit� per zone, in un altro
conversione da TIF RGB/CMYK e poi salvataggio in EPS.
Nessuno chiede scopo e particolari dell'algoritmo, ma il loop
di base da solo potrebbe essere importante. Per esempio,
in che formato � la matrice della bitmap in memoria ?
Bye, G. 

 Tenete presente che sto usando la versione express
Usando VC++/CLI (cioï¿œ .NET) non ci dovrebbero essere differenze 
significative rispetto a 
VB.NET
 o C#. Tutti i compilatori producono 
codice IL praticamente identico, che quindi viene eseguito dal Framework 
allo stesso modo.
Con VC++ Express non credo che si possa compilare nativamente, a meno di 
non installare il Platform SDK, rinunciando perï¿œ all'ambiente visuale
Se sei sicuro che nel tuo caso il codice nativo sia piï¿œ performante di 
quello .NET (non ï¿œ vero a priori) potresti compilare una DLL contenente 
il codice incriminato in nativo, e poi richiamarne le funzioni da .NET 
mediante PInvoke.
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3.0 Soluzioni a raccolta", molto piï¿œ di semplici 
FAQ! 
http://it.openoffice.org/doc/manuali/

 ciao
Il problema non ï¿½ che VB sia piï¿½ lento (nel caso di VB6 non c'ï¿½ neppure 
grande differenza di codice oggetto generato) ma che non ha funzioni di 
accesso diretto alla memoria.
Se, 
p.es
., lavori su immagini grandi e tratti oggetti delle dimensioni di 
byte o maggiori, non ï¿½ che farlo in C ti risolverebbe granchï¿½, a parte forse 
i loop stessi, che puoi ottimizzare usando variabili di registro come 
indici, ma alla fine i loop di VB sono piuttosto buoni.
Viceversa se hai bisogno di manipolare i singoli bit, in VB lo puoi fare con 
operazioni molto costose che in C sono spesso tradotte in operazioni del 
processore (o comunque non in chiamate di libreria) e quindi estremamente 
ottimizzate (naturalmente NON se compili per .net).
Tieni presente che in C puoi anche inserire codice assemler inline che ti 
permette di ottenere le massime prestazioni (naturalmente solo per le parti 
critiche perchï¿½ l'ASM ï¿½ un po' desueto).
Perï¿½ non si cambia linguaggio per scrivere una routine ottimizzata. La norma 
vorrebbe che ci si scelga il linguaggio piï¿½ congeniale per realizzare un 
progetto (o per tutta la vita) e poi semmai si scrivono (o ci si fanno 
scrivere) singole routine in linguaggi piï¿½ performanti quando si ha bisogno 
di prestazioni particolari. Ed ï¿½ questo che ti consiglio.
Ciao,
Stefano


con jpg di 4 megabyte il programma s'inchioda. Diventa inutilizzabile.
Ad occhio quello che deve fare il mio programma � inferiore a quello che hai 
citato.
Io carico l'immagine in un box, la passo ad una matrice temporanea.delle 
medesime dimensioni.
I calcoli sono effettuati sulla temporanea. Alla fine di tutti e due i loop 
scambio le immagini.

 con jpg di 4 megabyte il programma s'inchioda. Diventa inutilizzabile.
Scusa, ma stai lavorando su un thered separato ï¿œ fai tutto dal thread 
dell'applicazione? Perchï¿œ se una procedura impiega piï¿œ di una manciata 
di secondi allora ï¿œ praticamente d'obbligo una programmazione 
multithreading.


 ï¿œ fai tutto
o fai tutto...


 secondi allora � praticamente d'obbligo una programmazione multithreading.
l'applicazione � solo quel ciclo for. Il resto sono solo un paio di pulsanti 
per aprire il file e salvarlo.
Grazie x il consiglio 

 per aprire il file e salvarlo.
OK, ma cosa vuol dire esattamente "si blocca"? Ci mette tanto tempo e la 
finestra non si aggiorna, ma porta a termine il compito, oppure 
l'applicazione resta congelata per sempre?



la seconda... 

 la seconda...
In questo caso allora il discorso è diverso:
Finchè non sei sicuro che sia esclusivamente un problema di velocità,
non ha senso pensare di cambiare linguaggio... se lo lanci in Debug,
il programma si blocca o no? cioè se lo metti in pausa anche dopo un
sacco di tempo, è ancora dentro il loop che va avanti, oppure è
proprio in blocco?
Perchè se è bloccato allora hai un problema del tutto diverso, ed è
inutile parlare di prestazioni o di cambiare linguaggio...

 medesime dimensioni.
Cosa usi per caricare le immagini, ma soprattutto per passare
l'immagine alla matrice, comandi VB o API ?
Puoi spingerti fino a dare qualche spezzone di codice di esempio,
almeno di quest'ultimo passo ?
Nopn so se fai gi� una cosa del genere, ma nel caso io te lo dico...
potresti caricarla direttamente in una matrice di memoria, e solo
alla fine assegnarla ad una PictureBox.
Per capirci, dovresti dimensionare una Picture in memoria
con "Dim Foto As StdPicture", gli carichi l'immagine da file con
"Set Foto = LoadPicture(NomeDelFile)", poi con una GetObject
e un po' di codice ottieni le dimensioni, dimensioni una matrice
di Byte per contenere l'imagine, con una GetBitmapBits carichi
l'immagine nella matrice, fai tutte le operazioni che ti servono
direttamente sulla matrice e alla fine ricopi i byte nella matrice
originale con SetBitmapBits, la riassegni ad una PictureBox vera
e fai un refresh.
Sembra estremamente complicato a dirlo, e devo dire che mettere
insieme il codice non � stato facile, ma � un metodo molto pi� veloce
di quello che sembra, perch� la parte lenta del codice, cio� il loop
dei calcoli byte per byte, viene eseguito completamente su variabili
di memoria, senza riferimenti a propriet� od oggetti.
Bye, G. 

 e fai un refresh.
uhm
grazie intanto 

 ciao
Se usi VB.net sei incapsulato nei namespace del framework
quindi problemi di passaggio parametri NON dovresti averne!
Il problema è semmai LOGICO...si aspetta banane e gli passi bulloni!
...poi tanto per chiarire....
Io non sono un grafico ne un esperto come paperino di GDI e robe
varie...
PERO'
una mia routine è su internet che RIDIMENSIONA al volo immagini jpg
se usi dblog e squadretta le immagini la soluzione è il resize del
wodkino nazionale!
...inoltre....
il wodkino nazionale quando aveva tempo "complicò" il resize fino a
far perfino sovraimporre un testo ad una immagine tutto "al volo" via
internet...se vai sul mio blog...l'antispam usa il mio resize con il
"sovraimpose wodkiniano"
...e sicccome in quel periodo mi avanzava parecchio tempo mi misi a
spippolare per leggere l'exif e fare un crop mio "alla
flickr"...sempre via internet...e rigorosamente usabile ANCHE da asp
3.0 perchè dblog è scritto usando questa tecnologia!
http://www.martek.it/dblog/articolo.asp?articolo=40
e poi
http://www.martek.it/dblog/articolo.asp?articolo=41
uso tranquillamente file di mega e mega (per test)...e non si impalla
nulla! E non va nemmeno piano altrimenti via web sarebbe un macello!
Ora mi domando...ma che vorrà mai fare questo tipo?
Vuoi criptare un testo dentro una jpg?...puoi dirlo...è già stato
fatto!
Vuoi modificare una jpg per far eseguire del tuo codice
maligno?...puoi dirlo...è già stato fatto! e se il SO è stato patchato
attualmente non si può più fare!
Che segreto ci sarà mai dietro questa segretezza a far vedere 2
banalissime righe di codice???
Uè bello il più giovane di quelli che ti hanno risposto ha il catetere
ed il pannolone!...ne abbiamo visto di mondo...puoi postare un po di
codice eh!

 w = TempBmp.Width
Tanto per darti un riferimento, questo è un esempio che ho provato su
un file di circa 2 MB
      Dim startD As Date, elapsed As TimeSpan
      Dim TempBmp As Bitmap
      Dim c As Color
      Dim count As Integer
      Me.Text = String.Empty
      With PictureBox1
         'Dimensioni 2500x1900 circa
         .Image = Image.FromFile("C:\1.jpg")
         .Refresh()
         TempBmp = New Bitmap(.Image.Size.Width, .Image.Size.Height)
         TempBmp = CType(.Image, Bitmap)
      End With
      Cursor = Cursors.WaitCursor
      startD = Now
      For x As Integer = 0 To TempBmp.Width - 1
         For y As Integer = 0 To TempBmp.Height - 1
            'una operazione qualunque sui pixel
            c = TempBmp.GetPixel(x, y)
            If c.GetHue = Color.Black.GetHue Then
               TempBmp.SetPixel(x, y, Color.Aquamarine)
               count += 1
            End If
         Next
      Next
      elapsed = New TimeSpan(Now.Ticks - startD.Ticks)
      Me.Text = String.Format("Count: {0} Elapsed (ms): {1}" _
                                 , count _
                                 , elapsed.TotalMilliseconds.ToString)
      Cursor = Cursors.Default
Lanciato in modalità debug, impiega circa 7 secondi su un notebook non
particolarmente potente

particolarmente potente
ahia, alla fine � quasi quello che faccio io solo che non ci mette 7 
secondi.
cosa intendi con notebook non potente? Cos�, confronto meglio le cose!
grazie a tutti
vi faccio sapere!!!!

 - Mostra testo citato -
Ma scusa che vuoi farci con questi pixel???
Non sarebbe stato più semplice dirlo fin da principio?
Casomai avevi già la soluzione!
BAH!

 Casomai avevi gi� la soluzione!
Quoto. Sia per schiarire/scurire/contrastare/invertire che per cose
pi� complesse, tipo sovrapporre un logo, e perfino per aggiungere
dati steganografici :-), ci sono metodi pi� semplici e veloci che non
lavorare pixel per pixel.
Poi, magari, proprio per quello che deve fare lui non c'� niente,
ma come si fa a dirlo ?
Bye, G. 

Casomai avevi gi� la soluzione!
non � proprio quello che volevo fare. Cmq,
Nel frattempo sono riuscito ad ottimizzare un paio di cose, un paio di if 
superflui, e "compattato" delle variabili.
E alla fine, un file grosso, attorno ai 2mega me lo processa.
vediamo con altri.
Grazie a tutti
ciao

 ma come si fa a dirlo ?
NoNo, � proprio pixel * pixel!!!
un grazie immenso!!!
ciau 

 vi faccio sapere!!!!
Diciamo non una scartina, ma non l'ultimo grido.... dovrebbe essere
tipo CPU Core2 T5800 2 Ghz, 3 giga di RAM

 ciau
Porca paletta....mi verrebbe voglia di strappargli le braccine...
non sapremo mai cosa stracazzo voleva fare!
I fessi siamo noi che gli abbiamo dato spago!
E poi arriva e dice "mi sono ottimizzato 2 if"....non sò voi...ma io
lo saprei dove dovrebbe mettersele quelle if!!!! ;)
LAMER(s)....passano gli anni...ma resistono!!!
Cosa voleva fare ? passare a vc???
WOOOOOOOOSH!...eccolo servito!
bah!

 Bye, G.
Potrebbe scansionare una foto pixel per pixel per rilevare anomalie
cromatiche!
Casomai lavora all'OtoMelara e stà programmando il rilevatore di una
nuova mina anti-uomo!
O stà spippolando con una telecamera ad infrarossi per il rilevamento
del Semtex ad un gate di un aereoporto!
Oppure stà analizzando le anomalie cromatiche in un reattore iraniano!
...o stà cercando di estrapolare da una foto 2d un profilo 3d per
automatizzare l'analisi di foto satellitari...per cercare Bin Laden!!!
...Oppure sta analizzando l'iride per rilevare se sei allergico
all'insalata!
Che ne sappiamo noi....casomai sto usando un cannone per spararsi
nelle chiappe!...non lo sapremo mai!

 ciao
Cosa vuol dire ..."compattato delle variabili" lo sai solo tu!
Il nome della variabile influisce veramente poco!
Cmq...contento tu!
Ti ricordo solo che in vb6 è più veloce dichiarare variabili Long (in
un S.O. 32 bit) piuttosto che integer...o peggio ancora byte
in Net l'opposto! Dichiara Integer e lascia stare i long (int32 se
vuoi fare il fiscale!)