Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

PS. do tematu "Przeczytany, zamknięty Czy da się bez użycia warunków if"

Ostatnio zmodyfikowano 2011-01-01 14:42
Autor Wiadomość
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.
P-25658
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.
P-25659
ison
» 2010-12-27 15:43:52
1)
C/C++
a =- 3;
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
P-25660
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ś..
P-25661
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).
P-25662
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)
P-25663
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.
P-25664
ison
» 2010-12-27 16:16:26
tak na przyszłość to staraj się unikać dzielenia jeśli możesz
C/C++
a * 0.5
jest szybsze od
C/C++
a / 2

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
C/C++
a >> b;
jest równoznaczne z
C/C++
a / pow( 2, b );

więc w Twoim przypadku zamiast dzielenia przez 2 możesz przesunąć liczbę o 1 bit w prawo
C/C++
a >> 1;
P-25666
« 1 » 2 3 4 5 6 7 8
  Strona 1 z 8 Następna strona