| jsc Temat założony przez niniejszego użytkownika | PS. do tematu "Przeczytany, zamknięty	 Czy da się bez użycia warunków if" » 2010-12-27 15:30:12 (... Marys)Rozwiązanie F90M jest proste i skuteczne, dzięki wielkie!(...)
 Każdy ma swój gust, ale urządziłem wyścig:
 #include <iostream>
 #include <time.h>
 #include <math.h>
 
 using namespace std;
 
 int main()
 {
 #if 0
 int a = 5;
 int b, c;
 long int czas;
 
 
 czas = time (NULL);
 for (long int i1=0; i1 < 1000000000; ++i1) //F90M daje 20 sek.
 {
 
 b =( a - a % 2 ) / 2 - 1;
 c =( a + a % 2 ) / 2 - 2;
 
 }
 czas = czas - time (NULL);
 cout << czas;
 cin >> a;
 #endif
 
 #if 1
 int a = 5;
 int b, c;
 long int czas;
 
 
 czas = time (NULL);
 for (long int i1=0; i1 < 1000000000; ++i1) //JSC daje 19 sek.
 {
 a =- 3;
 b = a/2;
 c = a + ((a%2) == 1);
 
 }
 czas = czas - time (NULL);
 cout << czas;
 cin >> a;
 #endif
 
 return 0;
 }
 i okazało się, że moje rozwiązanie jest wydajniejsze i jak mi się wydaje po kompilacji zajmuje mniej miejsca.
 | 
|  | 
| DejaVu | » 2010-12-27 15:31:34 PS. temat możesz otworzyć, jeżeli jesteś jego autorem, a jeżeli nie - to zapewne autor nie jest zainteresowany dalszym ciągnięcem wątku i znalazł rozwiązanie, które go zadowala ;p
 /edit:
 Nie wiem czym się zachwycasz skoro to samo co Ty napisałeś można zrobić w czasie stałym, czyli O(1) :)
 
 /edit2:
 Ponadto obliczenia nie są wykonywane dla tych samych danych wejściowych i algorytmy nie są równoważne.
 | 
|  | 
| ison | » 2010-12-27 15:43:52 1) w jednym przypadku rozpatrujesz testy dla a=5 a w drugim dla a=-3 2) różnica między 19 sek a 20 może wynikać z błędów w mierzeniu czasu, wziąłeś pod uwagę że może akurat w chwili testowania któregoś z rozwiązań Twój komputer był bardziej obciążony? 3) Twoje rozwiązanie i tak nie jest najlepsze 4) dlaczego nie ctime i cmath? 5) wynik bardziej zależy od szczęścia Twój kod wykonuje się u mnie 8846 ms a kod F90M 8265 ms bez optymalizacji, a z optymalizacją po około 400 ms | 
|  | 
| pekfos | » 2010-12-27 15:56:51 pierwsze uruchomienie programu jest najdłuższe bo antywiry indeksują program i ew. analizują heurystycznie. ale ty oczywiście to uwzględniłeś.. | 
|  | 
| jsc Temat założony przez niniejszego użytkownika | » 2010-12-27 15:59:45 Dobra macie rację, że źle zadeklarowałem zmienne lokalne.
 A co wyniku to F90M 23 s. i JSC 21 s. przy porównywalnym obciążeniu sprawdzony na menedżerze zadań.
 
 A co do tego zachwytu to bym powiedział, że w nauczaniu programowania w ogóle nie pojawia się temat optymalizacji (tzn. tej podstawowej), a uczy się np. że do robienia silni jest lepsza rekurencja niż pętla for.
 
 4)
 dlaczego nie ctime i cmath?
 
 A to dlatego, że jest w C++ zielony, a w C to już jako tako sobie radzę. Ale dzięki za te dwie biblioteki, będę z nich często korzystał.
 
 A co uwagi o antywirusie to raczej zaprzeczę, ponieważ za każdą kompilacją kod jest inny (o to dbają komendy preprocesora #if 0/1 i #endif).
 | 
|  | 
| ison | » 2010-12-27 16:04:17 | że w nauczaniu programowania w ogóle nie pojawia się temat optymalizacji (tzn. tej podstawowej) 
 | 
 a co jest trudnego w dopisaniu -o3 przy kompilacji lub włączeniem tej opcji w narzędziach IDE? ;D | A to dlatego, że jest w C++ zielony, a w C to już jako tako sobie radzę. Ale dzięki za te dwie biblioteki, będę z nich często korzystał. 
 | 
 nie ma żadnych większych różnic między nimi... kod i tak Ci się skompiluje jedyna różnica jest taka że w headerach z C++ zawartość jest w namespace std; (teoretycznie) | 
|  | 
| jsc Temat założony przez niniejszego użytkownika | » 2010-12-27 16:09:22 Chodzi mi o proste sztuczki, które można dokonać na kodzie, a co do opcji kompilatora to włączanie i wyłączanie z równoczesnym dowiadywaniu się w Internecie jest uciążliwe, ale jak się pozna to można to można po prostu napisać makro powłoki systemowej. | 
|  | 
| ison | » 2010-12-27 16:16:26 tak na przyszłość to staraj się unikać dzielenia jeśli możesz jest szybsze od co więcej jeśli dzielisz przez potęgę dwójki to możesz zwyczajnie przesunąć liczbę bitowo w prawo o określoną liczbę miejsc jest równoznaczne z więc w Twoim przypadku zamiast dzielenia przez 2 możesz przesunąć liczbę o 1 bit w prawo | 
|  | 
| « 1 »  2 3 4 5 6 7 8 |