Newsgroup: it.comp.lang.c++
Titolo: Performance.

Salve,
sono nuovo del NG e non sono un esperto di programmazione C++,
ho creato un DLL con VC++ che fa dei semplici calcoli, si tratta di eseguire 
10 milioni di moltiplicazioni in precisione doppia. Ho compilato la DLL e 
l'ho richiamata da un'applicazione scritta in VB6.
Con mia grande sorpresa i tempi di esecuzione della routine in C++ sono 
maggiori di quelli della stessa routine scritta in VB6. Circa un 30% 
maggiori.
Stavo facendo queste prove per cercare di delegare una serie di calcoli, che 
mi sembravano troppo lenti eseguiti in VB, ad una DLL C++, ma ottengo delle 
performance addirittutra inferiori.
Sono sicuro che entrambe le routine eseguono gli stessi passaggi poichè il 
risultato finale è lo stesso.
Dove sbaglio?
Grazie a tutti,
Emiliano.

 Dove sbaglio?
Così a vuoto e senza la sfera di cristallo non è facile risponderti :-)
Posta il codice VC++ e ti possiamo dire qualcosa di più utile.

 Dove sbaglio?
Fai un passaggio per valore invece che per reference alla riga 128 di
matrix.cpp
il collo di bottiglia è evidentemente quello.
-- 
USB Priests for only 10$

 Posta il codice VC++ e ti possiamo dire qualcosa di piů utile. 

Ho fatto come dici e funziona tutto benissimo. ;)
Emiliano.


 Dove sbaglio?
Forse non hai attivato la compilazione ottimizzante.
Tutti i compilatori C++ hanno una o piu' opzioni per attivare varie 
tecniche di ottimizzazione del codice generato.
Normlamente, il comportamento di default e' di non eseguire 
ottimizzazioni o eseguire solo ottimizzazioni che riguardano singole 
righe di codice sorgente.
In VC++, per attivare tutte le ottimizzazioni sicure si usa l'opzione /Ox.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

Emiliano ha scritto:
[...]
Non è un test serio perché gran parte del lavoro svolto è inutile.
Kiuhnm

Non capisco cosa significa: anche la routine scritta in VB esegue gli stessi 
calcoli, perchè dici che non si tratta di un test serio? Ho fatto proprio 
questa sera un'altro test sommando tutti i sin(i) ottenendo lo stesso 
indentico risultato in termini di performance. A quanto pare il compilatore 
di VB è migliore o mi sbaglio?
Grazie, Emiliano.


Anche attivando questa opzione ottengo le medesime perfomance. Io ero 
*sicuro* che riscrivere parti di codice in C++ fosse la soluzione ai miei 
problemi di velocità, ma a quanto pare conviene lasciare tutto il codice in 
VB... A dire il vero sono ancora incredulo.
Grazie del consiglio, Emiliano.


>In VC++, per attivare tutte le ottimizzazioni sicure si usa l'opzione /Ox.
 > Anche attivando questa opzione ottengo le medesime perfomance. Io ero
 > *sicuro* che riscrivere parti di codice in C++ fosse la soluzione
 > ai miei problemi di velocità, ma a quanto pare conviene lasciare
 > tutto il codice in VB... A dire il vero sono ancora incredulo.
 > Grazie del consiglio, Emiliano.
In realta', attivando l'opzione /Ox con l'esempio che hai mostrato in un 
altro messaggio, si ottiene un tempo di esecuzione nullo, perche' 
l'ottimizzatore si rende conto che il ciclo e' inutile e lo elimina.
Un test piu' significativo potrebbe essere il seguente programma C++:
#include <iostream>
double Somma() {
   const double a = 0.512334;
   const double b = 3.132455;
   const int n_iter = 200000000;
   double ris = 0;
   for (int i = 0; i < n_iter; ++i) {
     ris += i > ris ? a : b;
   }
   return ris;
}
int main() {
    std::cout << Somma() << std::endl;
}
corrispondente al seguente programma 
VB.NET
:
Module Somma
Function Somma() As Double
   Const a As Double = 0.512334
   Const b As Double = 3.132455
   Const n_iter As Long = 200000000
   Dim ris As Double
   Dim i as Long
   For i = 0 To n_iter
     If i > ris Then ris = ris + a Else ris = ris + b
   Next I
   Somma = ris
End Function
Sub Main()
   System.Console.WriteLine(Somma)
End Sub
End Module
Sul mio computer, la versione 
VB.NET
 impiega circa 7.50 secondi, la 
versione C++, compilata dal VC++ 7.1 con le opzioni /GX /Ox impiega 
circa 0.81 secondi, cioe' un nono del tempo di VB.


Ciao,
ho fatto la stessa indentica prova compilando perņ l'applicazione con VB6 
con le dovute "ottimizzazioni" del compilatore di VB6 i risultati sono i 
seguenti:
VC++ 6 : 0.98 sec.
VB6 : 0.91 sec.
Probabilmente il codice compilato da 
VB.NET
 č molto piu lento di VB6, 
dovresti provare a compilare con VB6 se ce l'hai a disposizione altrimenti, 
se vuoi, ti mando la mia applicazione in VB6 cosi fai la stessa prova con il 
tuo PC.
Emiliano.


 di VB è migliore o mi sbaglio?
Anche qui, postare codice please. A parte che VB non ha un 
"compilatore", i tuoi test sono _parecchio_ limitati: se son tutti come 
il loop di prima non dicono niente sulla reale velocità di C++ e VB.

 tuo PC.
Questo è un test dove il linguaggio conta veramente poco. Tutto dipende 
da quale compilatore ottimizza meglio il codice. Tra i due codici 
sorgenti c'è praticamente una corrispondenza 1-1 quindi non mi sarei 
aspettato grandi differenze.
Kiuhnm