|
|
|
|
Strumenti |
19-01-2013, 13:40 | #101 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Si, su Windows XP a 32 bit, l'applicazione 2 di AnonimoVeneziano risulta più veloce di qualche secondo.
Vado a provare su Windows 8 a 64 bit. |
19-01-2013, 13:45 | #102 | ||
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Quote:
Come sarebbe canno? Codice:
int main(int argc, char* argv[]) { char szFileName[256]; unsigned char *bufferIn = NULL; unsigned char *bufferOut = NULL; long sizeBuffer; double Tempo1; double Tempo2; double Tempo3; double TempoTotale; uint64_t sizeOutput; clock_t c_start, c_end; if ( argc < 2 ) { #ifdef __linux__ PrintHelp(argv[0]); #else ExtractFileName(argv[0], szFileName); PrintHelp(szFileName); #endif printf("\nPremere INVIO per terminare."); getc(stdin); return -1; } //srand((unsigned)time(NULL)); printf("\nElaborazione del file %s in corso.\nAttendere prego...\n", argv[1]); if ( argc >= 3 ) sizeOutput = GetSizeOutput(argv[2]); else sizeOutput = 1024 * 1024; c_start = clock(); sizeBuffer = MakeBuffer(&bufferIn); c_end = clock(); Tempo1 = (double)(c_end - c_start) / CLOCKS_PER_SEC; printf("\nTempo impiegato per lettura dati -> %5.5f secondi\n", Tempo1); c_start = clock(); sizeBuffer = DFA(bufferIn, &bufferOut, sizeBuffer); c_end = clock(); Tempo2 = (double)(c_end - c_start) / CLOCKS_PER_SEC; printf("\nTempo impiegato per eliminare spazi e righe vuote -> %5.5f secondi\n", Tempo2); c_start = clock(); Mescola(bufferOut, argv[1], sizeBuffer, sizeOutput); c_end = clock(); Tempo3 = (double)(c_end - c_start) / CLOCKS_PER_SEC; printf("\nTempo impiegato per mescolare-> %5.5f secondi\n", Tempo3); TempoTotale = Tempo1 + Tempo2 + Tempo3; printf("\nTempo totale -> %5.5f secondi\n", TempoTotale); if ( bufferIn ) free(bufferIn); else printf("\nbufferIn e' NULL.\n"); if ( bufferOut ) free(bufferOut); else printf("\nbufferOut e' NULL.\n"); printf("\nPremere INVIO per terminare."); getc(stdin); return 0; } |
||
19-01-2013, 14:13 | #103 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
7,15 + 8,51 = 15,66
che è approssimativamente uguale a 15,559944 |
19-01-2013, 14:21 | #104 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Credo che usando "clock" (sia io che te) calcoliamo il tempo CPU che le rispettive funzioni impiegano piuttosto che il tempo ver
Il tempo reale di "time" dovrebbe essere quello più giusto (comprendente sia il tempo CPU che il tempo di I/O utilizzato, che non è considerato da "clock"), mentre il nostro tempo (che dovrebbe essere uguale a sys+usr di time) indica il tempo CPU utilizzato dal programma per fare il suo lavoro lavoro. IMHO Ciao
__________________
GPU Compiler Engineer |
19-01-2013, 14:23 | #105 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Giusto? |
|
19-01-2013, 14:25 | #106 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Quote:
In pratica i nostri tempi considerano solo il tempo CPU utilizzato dal programma. Quando però fai una "fwrite" in realtà il tuo programma si blocca e passa al sistema operativo per fare I/O. Io non credo che quel tempo sia computato da "clock" , almeno su Mac (su win non so , ma credo che anche lì sia lo stesso). Ciao
__________________
GPU Compiler Engineer |
|
19-01-2013, 14:35 | #107 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Esempio dei nostri programmi:
Il tuo programma ci impiega 6.8+7.4s di tempo CPU a lavorare, ma in totale (a causa dell'IO) in realtà impiega 21.5s. Il mio invece impiega 5.4+7.4s di tempo CPU (quindi in teoria un pochino più veloce) ma a causa dell'io ce ne impiega 21 di secondi. Quindi la velocità netta delle due versioni è praticamente la stessa a causa dell'IO (il programma è IO bound), mentre la mia seconda versione non è in grado di saturare la banda dell'IO del mio SSD risultando in tempi totali un po' più lenta (nonostante usi meno tempo CPU). Questa è la mia teoria a riguardo Ciao
__________________
GPU Compiler Engineer |
19-01-2013, 14:40 | #108 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
In effetti il tempo "Real" è leggermente superiore:
Non c'è modo di prendere il tempo Real in C? |
19-01-2013, 14:50 | #109 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Quote:
Su UNIX c'è "gettimeofday()" che ritorna secondi e microsecondi dalla epoch e si può usare per fare calcoli del genere. Per windows ci sarà un equivalente. CLOCK comunque rimane il sistema migliore per calcolare le performance (a meno che non ci sia di mezzo dell'IO pesante come in questo caso)
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 19-01-2013 alle 14:53. |
|
19-01-2013, 14:55 | #110 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Alt! Fermi tutti!
Se tolgo "Premere INVIO per terminare" ottengo tempi real migliori: Togliete dunque, nella funzione main, queste due righe di codice: Codice:
printf("\nPremere INVIO per terminare."); getc(stdin); Ultima modifica di Vincenzo1968 : 19-01-2013 alle 14:59. |
19-01-2013, 14:57 | #111 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Su Windows dovrebbe essere disponibile installando le GnuWin32 libraries(un porting di molti utili comandi unix su windows): http://getgnuwin32.sourceforge.net/ Ultima modifica di Vincenzo1968 : 19-01-2013 alle 15:01. |
|
19-01-2013, 14:59 | #112 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Quote:
__________________
GPU Compiler Engineer |
|
19-01-2013, 15:17 | #113 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Niente da fare:
Il comando time non è disponibile su Windows nemmeno installando le GnuWin32. Per questo contest utilizzerò Linux. Windows EDIT: o, meglio, i tempi li prenderò anche su Windows e mostrerò gli screenshot ma, per le classifiche, i tempi saranno quelli calcolati col comando time su Linux. Ultima modifica di Vincenzo1968 : 19-01-2013 alle 15:25. |
19-01-2013, 15:47 | #114 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
19-01-2013, 16:02 | #115 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
|
Ma in gnuwin32 non c'è time a disposizione?
__________________
GPU Compiler Engineer |
19-01-2013, 16:21 | #116 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Evidentemente no. Dando il comando mi dice che ho inserito l'ora sbagliata. (naturalmente ho GnuWin32 installato nel mio sistema da un bel pezzo per via di Flex e Bison. E ho anche messo il percorso in PATH nelle variabili d'ambiente Windows).
|
19-01-2013, 18:58 | #117 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
C'è una cosa che non mi quadra nello screenshot di Vicius:
7,15 secondi user 8,51 secondi system E real(totoal)? un minuto e trenta secondi? Non può essere. Sia da me che da AnonimoVeneziano(sul suo Mac) la differenza tra il totale di user e system e real è di pochi secondi(tre, quattro, cinque al massimo; massimo massimo massimo dieci). Che cacchio è? Ultima modifica di Vincenzo1968 : 19-01-2013 alle 19:16. |
19-01-2013, 19:49 | #118 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Che si può fare? come possiamo risolvere la cosa? |
|
19-01-2013, 22:28 | #119 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Secondo me conviene, per la classifica, prendere i tempi user e system e sommarli.
Anche perché ho eliminato un paio di printf dal mio codice e il tempo real scende a 27 secondi circa(27 virgola qualcosa, quasi ventotto). Il che mi vedrebbe vincitore ma non è assolutamente giusto visto che l'algoritmo-metodo di AnonimoVeneziano è più efficiente del mio. Ditemi che ne pensate. |
20-01-2013, 12:04 | #120 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Più veloce delle versioni C. Sia come tempo totale che come somma di user+system.
Codice:
➜ Contest time java -server Generate prova -D5GiB ci ho messo 88 secondi java -server Generate prova -D5GiB 6.74s user 5.79s system 14% cpu 1:28.81 total |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:34.