|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#61 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#62 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
|
|
|
|
|
|
|
#63 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Se il collo di bottiglia non e' nella lettura del file secondo me quelle quattrocento e passa linee di codice per leggere dei float da file sono un tantino overkill.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#64 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
supponiamo che il file contenga i dati per gestire delle statistiche. Per esempio, le colonne potrebbero rappresentare i livelli di reddito e le righe gruppi di età. Il programma deve caricare in memoria la matrice e trovare la sottomatrice rettangolare di somma massima ( Contest 5 Anche nei casi in cui bisogna eleborare una riga per volta, non mi spaventa l'idea di dover apportare qualche modifica all'automa. Ti assicuro che anche in questo caso le prestazioni rimarrebbero migliori. Se m'è venuta la fissazione per la velocità di esecuzione, è perchè mi sono scassato i cabasisi, in tanti anni di lavoro, a sentire gente che si lamenta della lentezza dei programmi. Già si lamenterebbero se propronessi un programma che compie il lavoro in un quarto d'ora. Figurati se ne proponessi uno che fa lo stesso lavoro in tre quarti d'ora Ciao |
|
|
|
|
|
|
#65 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma mi immagino che lo debba inserire in un'applicazione già fatta in C++. Quindi queste altre scelte non sono possibili.
Bello il tuo codice marco.r, un po' troppo "insensibile" agli errori di formato, ma bello In sostanza dipende tutto dalla quantità di dati letti in input. Se fossero centinaia di MB è chiaro che un pensierino alle prestazioni bisogna farlo. Se sono pochi MB assolutamente no. Imho bisogna, sempre, non solo in questo caso, tenere conto del giusto compromesso manutenibilità/leggibilità e prestazioni in base all'uso che ne dobbiamo fare. E ripeto: se quella parte fa da collo di bottiglia lo vedremo successivamente con un profiler: "Premature optimization is the root of all evil" (cit. Donald Knuth) Senza contare magari arrivando all'implementazione si vede che il collo di bottiglia sta nell'accesso ai dati caricati e non nel caricamento, e la cosa sarebbe davvero comica |
|
|
|
|
|
#66 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
si hai perfettamente ragione. Intendevo semplicemente dire che, se l'input è di dimensioni ridotte, va bene qualunque linguaggio e qualunque algoritmo. Per esempio, nel caso dell'ordinamento, andrebbe bene e, anzi forse sarebbe meglio, utilizzare il bubble sort anziché quicksort. Riguardo alla frase di Knuth(che considero un dio nel campo della programmazione) ti vorrei far notare una cosa: Premature optimization is the root of all evil I tre volumi di The Art of Computer Programming sono un monumento alla ricerca delle massime prestazioni dei programmi. Ciao P.S. Proprio Knuth è uno dei pionieri nel campo del parsing e della teoria degli automi. Non vedo l'ora che escano gli altri due volumi della serie e in particolar modo il quinto: Syntactic Algorithms che sarà interamente dedicato all'analisi lessicale(leggi automi a stati Ultima modifica di Vincenzo1968 : 17-09-2008 alle 12:23. |
|
|
|
|
|
|
#67 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Appunto. Ma sono perfettamente d'accordo. Nessuno ha detto che non bisogna ottimizzare, ma bisogna farlo quando abbiamo un contesto di lavoro tipo e una prova del fatto che quella parte del codice vada ottimizzata.
Imho usare il tuo codice, per carità bello e prestante, le macchine a stati l'ho usate spesso in passato, è come sparare ad una mosca con un cannone se non lo applichiamo in un contesto preciso: cioè un'enorme quantità di dati. Tra l'altro le macchine a stati si trovano perfettamente a proprio agio in un contesto Object Oriented: vedi lo State pattern. E fortunatamente sparisce quello switch Ultima modifica di cionci : 17-09-2008 alle 12:32. |
|
|
|
|
|
#68 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Ti baseresti sul fatto che il programma verrà probabilmente utilizzato su input di piccole dimensioni o cercheresti di ottimizzarlo al massimo? P.S. Che cabaso vuol dire 'imho'? Ultima modifica di Vincenzo1968 : 17-09-2008 alle 12:33. |
|
|
|
|
|
|
#69 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Come già detto dipende dal contesto e dal programma. Bisognerebbe stabilire un testbed tipo ed uno straordinario e vedere se ci sono problemi di prestazioni. Se ci sono prendo un profiler e vedo qual'è la parte del codice che mi fa da collo di bottiglia. A quel punto comincio ad ottimizzarla. E così avanti fino a quando non ottengo prestazioni decenti. |
|
|
|
|
|
|
#70 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Propongo una specie di contest. Realizziamo un programma per un ipotetico istituto di statistica. Il programma dovrà leggere una serie di file di testo(ogni file potrebbe rappresentare, per esempio, i dati di ognuno dei comuni italiani) che contengono i dati raggruppati per livelli di reddito(le colonne) e gruppi di età(le righe). Bisogna leggere in memoria la matrice e calcolando la media, sottrarre quest'ultima da ogni elemento della matrice ottenendo una seconda matrice con valori e positivi e negativi; altrimenti, con tutti i valori positivi, la soluzione risulterebbe banale: la somma degli elementi dell'intero array. È la stessa tecnica che si utilizza quando bisogna ricercare la brightest area di una bitmap. Da questa seconda matrice si calcolino le sottomatrici rettangolari di somma minima e massima. Penso che sia una cosa di interesse generale vedere come utilizzare in pratica un profiler per ottimizzare le prestazioni di un programma. Ultima modifica di Vincenzo1968 : 17-09-2008 alle 13:40. |
|
|
|
|
|
|
#71 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Bella idea permun contest Vincenzo, potresti aprire una nuova discussione e intitolarla "Contest 6: ..." così da continuare la tradizione iniziata con GugoXX
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#72 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
grazie. A proposito, che fine ha fatto Gugo? È ancora in ferie? A quando il prossimo contest? |
|
|
|
|
|
|
#73 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#74 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Ad esempio si puo' fare qualcosa del tipo Codice:
void read_matrix( const string& filename, vector< vector<float> >& matrix )
{
string s;
ifstream input( filename.c_str() );
while ( getline( input, s ) )
{
try
{
matrix.push_back( vector<float>() );
istringstream is(s);
is.exceptions( ifstream::badbit | ifstream::failbit );
copy( istream_iterator<float>( is ),
istream_iterator<float>(),
back_inserter( matrix.back() ) );
if ( matrix.back().size() != 365 )
matrix.pop_back();
} catch( ifstream::failure e )
{ /* Ignore wrong line */ }
}
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#75 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
|
|
|
|
|
|
|
#76 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Ho provato le due versioni(con e senza gestione delle eccezioni) e impiegano lo stesso tempo(circa 98 secondi). Ma guarda cosa succede con il seguente file: Codice:
2.025e+12 3.125e-15 2.125e-5 1.0125e-10 2.ciao 5.12548e-12 Il tuo programma non segnala l'errore e la seguente riga di codice: Codice:
cout << "v[1][1] -> " << matrix[1][1] << endl; Codice:
v[1][1] -> 2 |
|
|
|
|
|
|
#77 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' normale per come gestisce la conversione lo stream, ma l'errore dovrebbe appare sicuramente sull'elemento successivo.
|
|
|
|
|
|
#78 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Con quest'altro file: Codice:
2.025e+12 3.125e-15 2.125e-5 1.0125e-10 ciao 5.12548e-12 |
|
|
|
|
|
|
#79 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Codice:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <ctime>
using namespace std;
void read_matrix1( const string& filename, vector< vector<float> >& matrix )
{
string s;
ifstream input( filename.c_str() );
while ( getline( input, s ) )
{
matrix.push_back( vector<float>() );
istringstream is(s);
copy( istream_iterator<float>( is ),
istream_iterator<float>(),
back_inserter( matrix.back() ) );
}
}
void read_matrix2( const string& filename, vector< vector<float> >& matrix )
{
string s;
ifstream input( filename.c_str() );
while ( getline( input, s ) )
{
try
{
matrix.push_back( vector<float>() );
istringstream is(s);
is.exceptions( ifstream::badbit | ifstream::failbit );
copy( istream_iterator<float>( is ),
istream_iterator<float>(),
back_inserter( matrix.back() ) );
if ( matrix.back().size() != 365 )
matrix.pop_back();
} catch( ifstream::failure e )
{ /* Ignore wrong line */ }
}
}
int main()
{
clock_t c_start, c_end;
c_start = clock();
vector< vector<float> > matrix;
read_matrix2("C:\\Temp\\test1.txt", matrix);
cout << endl;
cout << "v[0][0] -> " << matrix[0][0] << endl;
cout << "v[1][1] -> " << matrix[1][1] << endl;
c_end = clock();
printf("\nTempo impiegato -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);
return 0;
}
|
|
|
|
|
|
#80 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
eh, dovrei provare il codice prima di postarlo
, soprattutto sulle cose che e' un po' che non guardo C'e' un errore, anzi due. Il primo e' che quando raccolgo l'eccezione dovrei eliminare l'array parzialmente letto: Codice:
catch( ifstream::failure e )
{ matrix.pop_back(); }
Purtroppo l'unica e cambiare un po' il codice e passare ad una lettura "normale" Codice:
void read_matrix( const string& filename, vector< vector<float> >& matrix, int line_size )
{
string s;
ifstream input( filename.c_str() );
while ( getline( input, s ) )
{
istringstream is(s);
try
{
matrix.push_back( vector<float>(line_size) );
is.exceptions( ios::badbit | ios::failbit );
for ( int i=0 ; i<line_size ; ++i )
{
is >> matrix.back()[i];
}
is.exceptions( ios::goodbit );
// Be sure that there isn't anything left on the line...
string s;
if ( is >> s )
{
matrix.pop_back();
}
} catch( const ifstream::failure& e )
{
matrix.pop_back();
}
}
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:08.












, soprattutto sulle cose che e' un po' che non guardo








