pętla w pętli i czas wykonywania funkcji

0

Taki program żeby troche obciążyć procesor:

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;

float zlozona() {
	float g, t, w;
	for(int i=0; i<1000; i++)
	{
		t=990.0;
		w = (t*2.0*(t/2.0))/(t*(t+1.0)*(t*t*t));
		sqrt(w);
		for(int i=0; i<1000; i++)
		{
			t=990.0;
			w = (t*2.0*(t/2.0))/(t*(t+1.0)*(t*t*t));
			sqrt(w);
			for(int i=0; i<1000; i++)
			{
				t=990.0;
				w = (t*2.0*(t/2.0))/(t*(t+1.0)*(t*t*t));
				sqrt(w);
			}
		}
	}
	return w;
}


int _tmain(int argc, _TCHAR* argv[])
{
	time_t start,end;
	time (&start);
	zlozona();
	time (&end);
	double dif = difftime (end,start);
	printf ("Czas wykonania funkcji wynosi %.2lf sekund.\n", dif );
	system("pause");
	return 0;
}

Niestety coś jest nie tak bo odpala się konsola i nie wyświetla tego czasu ani komunikatu system("pause"). O co tu chodzi?
Jak usunę jedną pętle for to działa dobrze.

0
lofi napisał(a):

Taki program żeby troche obciążyć procesor
I dziwisz się, że procesor potrzebuje trochę czasu żeby to policzyć?

PS. Dodatkowo kod jest błędny. We wszystkich pętlach używasz zmiennej i. Już nie wspominając o tym, że da się to skrócić do jednej pętli.

0

Lofi, chyba za krótko czekałeś ;)
Policz sobie tak pi razy oko. Instrukcje w najbardziej zagnieżdżonej pętli wykonają się 1000 * 1000 * 1000 razy co daje miliard razy. Gdyby czas wykonania instrukcji w najbardziej zagnieżdżonej pętli był równy tylko 1 mikrosekundę to i tak musisz poczekać przynajmniej 1000 sekund na zakończenie działania funkcji. Hint: Jedna godzina to 3600 sekund.

0

@lukasz1235, też sądziłem, że kod jest błędny. Wrzuciłem do kompilatora, zmieniłem nazwy zmiennych w pętlach wewnętrznych i program się skończył. Potem sprawdziłem czy na pewno jest błędny - przywróciłem pierwotne nazwy, program się skompilował i wykonał.
@kawaoshi, skąd wziąłeś taki ogromny czas, u mnie było około 90 sekund.

0

Widać wykonanie jednego obiegu pętli zajmuje mniej niż jedną mikrosekundę. U mnie ok. 115 sekund przy taktowaniu rdzenia na 2.1Ghz, z optymalizacjami poniżej 1 sek. :p

0

ok, jeszcze jedno, zmniejszyłem trochę tych obiegów pętli ale dlaczego jeżeli w VS wybiorę Debug to czas wykonania tej funkcji wynosi 10 sekund a jak zmienie na Release to od razu dostaje wynik że 0 sekund. Skąd ta różnica?

0

Dlatego, że konfiguracja release ma domyślnie włączone optymalizacje na poziomie O2 - maksymalizowanie prędkości. Patrz komentarz Zjarka do mojego poprzedniego postu.

0

Są dwa rozwiązania, albo użyj volatile (tutaj nie jestem pewien, czy na pewno kompilator nie może zoptymalizować, ale na gcc to działa), albo wykorzystuj wcześniej obliczoną wartość w w kolejnych obliczeniach (np. t = 990.0 + w*1e6).

0

Clang 3.0, kompilacja z -O3:

Czas wykonania funkcji wynosi 0.00 sekund.

sama funkcja licząca w asemblerze wygląda tak:

LCPI0_0:
	.long	814579912
	.text
	.globl	__Z7zlozonav
	.align	16, 0x90
__Z7zlozonav:
	flds	LCPI0_0
	ret

Czyli wynik (814579912) został już ustalony w czasie kompilacji. Wow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1