DOMANDA [C++] Tempo di esecuzione e stampa su carta

Stato
Discussione chiusa ad ulteriori risposte.

MPG

Utente Attivo
544
4
Scusate dovrei usare bubble sort e selection sort con degli array e stampare su carta la codifica degli algoritmi il tempo di esecuzione. MI potete dire come si fa a calcolare il tempo di esecuzione del processo e come si stampa il tutto (codifica e tempo) su carta (anzichè a video)?
Grazie a tutti.
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
WTF? Non penso che il professore sia passato ad imporvi cose abbastanza complicate come la stampa...
Al massimo l’uso degli oggetti ofstream o del tipo FILE...
Comunque:
C++:
#include <ctime>
...
time_t inizio = time(NULL);
...
double tempoDiSorting = difftime(time(NULL), inizio);

Ci sono altri metodi, questo proviene da C ed è il più immediato.
 

MPG

Utente Attivo
544
4
WTF? Non penso che il professore sia passato ad imporvi cose abbastanza complicate come la stampa...
Al massimo l’uso degli oggetti ofstream o del tipo FILE...
Comunque:
C++:
#include <ctime>
...
time_t inizio = time(NULL);
...
double tempoDiSorting = difftime(time(NULL), inizio);

Ci sono altri metodi, questo proviene da C ed è il più immediato.

Questo che hai scritto è solo per vedere il tempo di esecuzione giusto?
online ho trovato anche questi:
Codice:
clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

o


Codice:
time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

che differenze con il tuo?
 
Ultima modifica:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Questo che hai scritto è solo per vedere il tempo di esecuzione giusto?
online ho trovato anche questi:
Codice:
clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

o


Codice:
time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

che differenze con il tuo?
Usa quello che ti pare
 

MPG

Utente Attivo
544
4
No è che mi piacerebbe sapere la differenza, poichè non ci è stato spiegato. Io parto con usare il tuo mi piacerebbe capirlo bene pero' come gli altri (che pero' ho trovato su siti stranieri e non riesco a capirli bene).Scusa se ho scritto cose magari banali per te, ma non vorrei ti fossi offeso (perchè ho postato altri esempi solo per capire le differenze) leggendo la tua ultima risposta ("usa quello che ti pare"), mi dispiacerebbe.
 
Ultima modifica:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
No è che mi piacerebbe sapere la differenza, poichè non ci è stato spiegato. Io parto con usare il tuo mi piacerebbe capirlo bene pero' come gli altri (che pero' ho trovato su siti stranieri e non riesco a capirli bene).Scusa se ho scritto cose magari banali per te, ma non vorrei ti fossi offeso (perchè ho postato altri esempi solo per capire le differenze) leggendo la tua ultima risposta ("usa quello che ti pare"), mi dispiacerebbe.
No non sono banali a dire il vero. Quello con clock() forse usa i cicli di clock per ricondure i secondi, mentre il secondo è come il mio ma fa un prodotto con 1000 (penso sia per i millisecondi).
Un’ultima variante, e forse la migliore per C++ è con l’header <chrono>, ma fa essenzialmente la stessa cosa del time() complicandola con vari metodi.
 

MPG

Utente Attivo
544
4
Ho provato cosi'
Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
time_t inizio = time(NULL);

const int n = 3;
int vet[n];
int tmp;
for(int i=0;i<n;i++)
{
    cin>>vet[i];
}
cout<<endl;
bool flag =  true;
int stop = n - 1;

while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {
            //swap(vet[i], vet[i + 1]); // std::swap()
            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
for(int i=0;i<n; i++)
{
    cout<<vet[i]<<endl;
   double tempoDiSorting = difftime(time(NULL), inizio);
}
}

Ma che metta o non metta le tre righe mi viene sempre cosi come in foto, cioè anche senza quelle tre righe mi viene l'execution time come è possibile? A dir la verità l'execution time è tanto piu' lungo quanto di piu' ci metto a scrivere i numeri dell'array..... non riesco a capire... Forse il tempo di esecuzione per non essere influenzato da quanto ci mette uno a scrivere bisigna usare solo in numeri casuali cosi' avviene tutto in maniera automatica? oppure c'è un modo per valutare esattamente il tempo di calcolo al di la' del fatto che uno inserisca o meno manualmente i numeri dell'array?
Ci è stato chiesto che la codifica degli algoritmi e la tabella con tempi e confronti tra selection sort e bubble sort va stampata su carta: come si fa??
 

Allegati

  • tempo di esecuzione.jpg
    tempo di esecuzione.jpg
    47.4 KB · Visualizzazioni: 131
Ultima modifica:

MPG

Utente Attivo
544
4
Ho provato cosi'
Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
time_t inizio = time(NULL);

const int n = 3;
int vet[n];
int tmp;
for(int i=0;i<n;i++)
{
    cin>>vet[i];
}
cout<<endl;
bool flag =  true;
int stop = n - 1;

while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {
            //swap(vet[i], vet[i + 1]); // std::swap()
            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
for(int i=0;i<n; i++)
{
    cout<<vet[i]<<endl;
   double tempoDiSorting = difftime(time(NULL), inizio);
}
}

Ma che metta o non metta le tre righe mi viene sempre cosi come in foto, cioè anche senza quelle tre righe mi viene l'execution time come è possibile? A dir la verità l'execution time è tanto piu' lungo quanto di piu' ci metto a scrivere i numeri dell'array..... non riesco a capire... Forse il tempo di esecuzione per non essere influenzato da quanto ci mette uno a scrivere bisigna usare solo in numeri casuali cosi' avviene tutto in maniera automatica? oppure c'è un modo per valutare esattamente il tempo di calcolo al di la' del fatto che uno inserisca o meno manualmente i numeri dell'array?
Ci è stato chiesto che la codifica degli algoritmi e la tabella con tempi e confronti tra selection sort e bubble sort va stampata su carta: come si fa??

Ho trovato online anche questo ma non pare cambia nulla:

int start_s=clock();
// the code you wish to time goes here
int stop_s=clock();
cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl


AIuto!!!!
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,224
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Andando a tentativi difficilmente cambierà qualcosa...

Codice:
clock_t start = clock();
// codice 
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC;

Questo restituisce il tempo di esecuzione; però attenzione, è il tempo di esecuzione calcolato in base all'inizio dell'esecuzione ed al tempo che l'OS ha dedicato al tuo processo. Non è il tempo in secondo che ti aspetti insomma, ma il tempo che ha trascorso effettivamente in esecuzione.

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 

MPG

Utente Attivo
544
4
Non riesco appunto a generare il tempo di esecuzione del solo bubble sort ripeto se inserisco manualmente i numeri dell'array, mi da' sempre appunto il tempo che l'OS ha dedicato al processo. Ho messo quello che _Achille mi ha suggerito ma nulla , a meno che ho fatto errori... ma cosi' è:
Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
time_t inizio = time(NULL);

const int n = 3;
int vet[n];
int tmp;
for(int i=0;i<n;i++)
{
    cin>>vet[i];
}
cout<<endl;
bool flag =  true;
int stop = n - 1;

while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {
            //swap(vet[i], vet[i + 1]); // std::swap()
            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
}
for(int i=0;i<n; i++)
{
    cout<<vet[i]<<endl;
   double tempoDiSorting = difftime(time(NULL), inizio);
}
}
 

Andretti60

Utente Èlite
6,440
5,091
Devi inizializzare "inizio" subito prima del ciclo while, e calcolare tempoDiSorting subito dopo. E poi perché mai lo hai messo dentro il ciclo che stampa il risultato?
 

Andretti60

Utente Èlite
6,440
5,091
E come ti hanno detto, quello non è il tempo passato dal ciclo, ma quello trascorso, che è ovviamente maggiore perché il computer nel frattempo fa altre cose. Io in genere faccio girare il programma una ventina di volte e prendo il tempo minore.
 

MPG

Utente Attivo
544
4
Devi inizializzare "inizio" subito prima del ciclo while, e calcolare tempoDiSorting subito dopo. E poi perché mai lo hai messo dentro il ciclo che stampa il risultato?

QUindi cosi'?

Codice:
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
const int n = 3;
int vet[n];
int tmp;
for(int i=0;i<n;i++)
{
    cin>>vet[i];
}
cout<<endl;
bool flag =  true;
int stop = n - 1;
time_t inizio = time(NULL);
while (flag)
{
    flag = false;
    for (int i = 0; i <= stop; i++)
        if (vet[i] > vet[i + 1])
        {
            //swap(vet[i], vet[i + 1]); // std::swap()
            tmp=vet[i];
            vet[i]=vet[i+1];
            vet[i+1]=tmp;
            flag = true;
        }

    stop = stop - 1;
double tempoDiSorting = difftime(time(NULL), inizio);
}
for(int i=0;i<n; i++)
{
    cout<<vet[i]<<endl;
}
}
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Non devi stampare l’array ordinato, sai già che è ordinato perfettamente.
Devi stampare il tempo.

L’ideale per questi esercizi è utilizzare un file di input per prendere i valori o direttamente creare l’array già con i valori evitando ogni volta la digitazione dei valori... Del tipo:
C++:
//...
int array[] = { 4, 1, 9, 6, 0, 8, 3, 7, 2, 5 };
//... sorting

Comunque spero che metterlo dentro al while sia stato solo un errore di distrazione...

Ah e per quanto rigurarda il BubbleSort un Do-While è molto meglio. Puoi quindi togliere l’inizializzazione da flag e mettere la condizione alla fine.
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili