Qt mereni casu trvani funkci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Qt mereni casu trvani funkci – C / C++ – Fórum – Programujte.comQt mereni casu trvani funkci – C / C++ – Fórum – Programujte.com

 

peter
~ Anonymní uživatel
4014 příspěvků
2. 10. 2015   #1
-
0
-

Cim se v qt meri cas trvani funkce, kodu? Zkousel jsem tohle v me funkci, ale vzdy mi to hodi stejny cas po kliknuti na sipecku Spustit program.

    //return GetTickCount();
//    return clock(); //  / (double)CLOCKS_PER_SEC
//time_t seconds;
//time(&seconds);
//    return seconds;
    //return  	QDateTime::toMSecsSinceEpoch();
//    return QDateTime::currentMSecsSinceEpoch() - QDateTime(QDate::currentDate()).toMSecsSinceEpoch();
    return QDateTime(QDate::currentDate()).toMSecsSinceEpoch();
     myMicroTimeClass *myTimer = new myMicroTimeClass();

//    enum { NumRows = 5, NumColumns = 10 };

ui->textEdit->append(QString::number(myTimer->get())); // mereni casu
         int i,j;
         for (i = 0; i < NumRows; ++i) {
             for (j = 0; j < NumColumns; ++j) {
                 QColor clearColor;
                 clearColor.setHsv(((i * NumColumns) + j) * 255
                                   / (NumRows * NumColumns - 1),
                                   255, 63);

                 glWidgets[i][j] = new GLWidget; // to by melo teoreticky trvat asi delsi cas
                 glWidgets[i][j]->setClearColor(clearColor);
                 glWidgets[i][j]->rotateBy(+42 * 16, +42 * 16, -21 * 16);


                 layout2->addWidget(glWidgets[i][j], i, j);

                 connect(glWidgets[i][j], SIGNAL(clicked()),
                         this, SLOT(setCurrentGlWidget()));

             }

         }
         ui->textEdit->append(QString::number(myTimer->get())); // mereni casu


No, a obe ty cisla jsou stejna, i pri mereni clocku. (return clock();)

Kdyz dam treba
// enum { NumRows = 20, NumColumns = 30 }; NEZADAVAT TAK VYSOKE HODNOTY
tak mi to po spusteni programu generuje okno strasne dlouho, asi minutu a hlavne v prvnim okamziku AVG vyhlasi neznamou infekci, stupen 4 cervene puntiky :)
Takze netusim, v cem je problem. Nebo treba zkuste poslat testovaci kod, ja ty veci s glWidgets zakomentuji a pustim tam vasi funkci, co to bude provadet... Zatim se v C moc neorientuji a netusim, jaky prikaz slouzi treba pro pauzu 500ms.

Nahlásit jako SPAM
IP: 2001:718:2601:258:8455:10...–
Radek Chalupa
~ Redaktor
+1
Super člen
3. 10. 2015   #2
-
0
-

#1 peter
Ve Windows jsou pro měření času s vysokou přesností 2 možnosti (pomocí API funkcí) - QueryPerformanceCounter nebo GetSystemTimePreciseAsFlieTime (tato je dostupná až od Windows 8).

Viz příklad:

FILETIME ft1;
FILETIME ft2;
LARGE_INTEGER li1;
LARGE_INTEGER li2;
LARGE_INTEGER lif;

void test1()
{
	QueryPerformanceCounter(&li1);
	LoadIcon(nullptr, IDI_INFORMATION);
//	Sleep(200);
	QueryPerformanceCounter(&li2);
	wprintf(L"%.3f mikrosekund\n", (double)(li2.QuadPart - li1.QuadPart) * 1000000/(lif.QuadPart));
}

void test2()
{
	GetSystemTimePreciseAsFileTime(&ft1);
	LoadCursor(nullptr, IDC_ARROW);
	//Sleep(400);
	GetSystemTimePreciseAsFileTime(&ft2);
	wprintf(L"%.3f mikrosekund\n", (double)(ft2.dwLowDateTime - ft1.dwLowDateTime) / 10);
}

int main()
{
	QueryPerformanceFrequency(&lif);
	test1();
	test2();
	getchar();
	return 0;
}

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
peter
~ Anonymní uživatel
4014 příspěvků
14. 10. 2015   #3
-
0
-

Dik. Trochu googlovani k te funkci. Nasel jsem i pekne videjko a trocha to prepsal (protoze mi to neslo uplne vlozit, ale s tim se jeste poperu). A meri to.

         LARGE_INTEGER clock_frequency;
         LARGE_INTEGER start_time;
         LARGE_INTEGER end_time;
         LARGE_INTEGER delta;
         float delta_second;

         QueryPerformanceFrequency(&clock_frequency);
         QueryPerformanceCounter(&start_time);
         Sleep(200);
         QueryPerformanceCounter(&end_time);

         delta.QuadPart = end_time.QuadPart - start_time.QuadPart;
         delta_second   = ((float)delta.QuadPart) / clock_frequency.QuadPart;
         ui->textEdit->append(QString::number(delta_second));
Nahlásit jako SPAM
IP: 2001:718:2601:26c:a1ee:5a...–
peter
~ Anonymní uživatel
4014 příspěvků
14. 10. 2015   #4
-
0
-

Narazim na pro mne naprosto zahadny problem. Nejak to nepocita.
 

         float a = myTimer->get();
            Sleep(100);
//         ui->textEdit->append(QString::number(myTimer->next()));
//         ui->textEdit->append(QString::number(myTimer->get()));
//         ui->textEdit->append(QString::number(myTimer->getFreq()));
         float x = myTimer->get();
         float y = myTimer->getFreq();
         float b = x - a;
         float z = x/y;
         float c = b/y;
         ui->textEdit->append(QString::number(x));
         ui->textEdit->append(QString::number(y));
         ui->textEdit->append(QString::number(z));
         ui->textEdit->append(QString::number(b));
         ui->textEdit->append(QString::number(c));
/*
Vygeneruje
376933400966
3.76935e+11
1.43182e+07
26325.6
1.47456e+06
0.102985 - cili 100 ms, spravne
*/

Jenze kod funkce NEXT vypise nulu.
myMicroTimeClass::myMicroTimeClass()
{
    this->clock_frequency = this->getFreq();
    this->start();
}
myMicroTimeClass::~myMicroTimeClass()
{
}
float myMicroTimeClass::getFreq()
{
    QueryPerformanceFrequency(&this->freq);
    return (float)this->freq.QuadPart;
}
LONGLONG myMicroTimeClass::get()
{
    QueryPerformanceCounter(&this->time);
    return (float)this->time.QuadPart;
}
void myMicroTimeClass::start()
{
    this->time_start = this->get();
}
void myMicroTimeClass::end()
{
    this->time_end = this->get();
}
myMicroTimeClass::next()
{
    this->end();
    this->delta = this->time_end - this->time_start;
    this->delta_second = this->delta / this->clock_frequency;
    this->start();
    return (float)this->delta_second;
    // / ((float)(this->clock_frequency));
//    return (float)this->clock_frequency;
//     / this->clock_frequency.QuadPart
}

Nahlásit jako SPAM
IP: 2001:718:2601:26c:a1ee:5a...–
peter
~ Anonymní uživatel
4014 příspěvků
14. 10. 2015   #5
-
0
-

   

         ui->textEdit->append(QString::number(myTimer->next()));
            Sleep(100);
         ui->textEdit->append(QString::number(myTimer->next()));

// Jo opravil jsem to na float, ale stale to pise nulu
LONGLONG myMicroTimeClass::get()
float myMicroTimeClass::get()
Nahlásit jako SPAM
IP: 2001:718:2601:26c:a1ee:5a...–
peter
~ Anonymní uživatel
4014 příspěvků
15. 10. 2015   #6
-
0
-

   

myMicroTimeClass::next()
{
    this->end();
    this->delta = this->time_end - this->time_start;
    this->delta_second = this->delta / this->clock_frequency;
    this->start();
    return this->delta_second; // vypise 0 0 0
//    return this->delta;  // vypise 0 8192 1462272
//    return this->clock_frequency; // vypise 14318180 14318180 14318180
}

Evidentne se neprovede deleni. Desetinna cisla se normalne vypisuji. Ale kdyz se to podeli mimo class, tak to funguje. Zahada nad zahadu...

Nahlásit jako SPAM
IP: 2001:718:2601:26c:a863:bb...–
peter
~ Anonymní uživatel
4014 příspěvků
15. 10. 2015   #7
-
0
-

Uz to mam.
float next(); - misto
next(); - jsem mel toto, a on 0.123 konvertoval asi na (int) 0

NESNASIM QT!!!

Nahlásit jako SPAM
IP: 2001:718:2601:26c:a863:bb...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 52 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý