Który kod optymalniejszy?

0

Który waszym zdaniem kod jest bardzie optymalny? i dlaczego tak uważacie?
KOD1:

#include<cstdio>

int main()
{
    double a, b, c;
    while(scanf("%le%le%le", &a, &b, &c)){
    if(a+b>c && a+c>b && c+b>a) printf("%hd\n", 1);
    else printf("%hd\n", 0);
    }
    return 0;
}

KOD2:

#include<iostream>
using namespace std;
int main()
{
    double a, b, c;
    while(cin>>a>>b>>c){
    if(a+b>c && a+c>b && c+b>a) cout<<1<<endl;
    else cout<<0<<endl;
    }
    return 0;
}
1

Czyli chodzi co o zwrot "stdio vs iostream performance" do wpisania w Google? Tutaj masz wynik z pierwszej strony: http://stackoverflow.com/questions/4340396/does-the-c-standard-mandate-poor-performance-for-iostreams-or-am-i-just-dealin poczytaj sobie.

0

Jeśli chodzi Ci o konkursy, używaj scanfa. Jeżeli nie, używaj iostream. Główną zaletą iostream jest to, że składnia nie zależy od typu danych. Jeżeli odpowiednio używasz typedefów, to bez kłopotu możesz przerobić program z powiedzmy double na float (program zbyt wolno liczy/zajmuje za dużo pamięci), long double (potrzebna większa precyzja), czy w ogóle jakiś typ ułamkowy o nieskończonej precyzji. Nadal wtedy twoje funkcje wypisujące działają. Dodatkowo możesz przeciążać operator<< dla obiektów, co także poprawia czytelność kodu. Najszybsze i tak jest samodzielne wczytywanie danych do dość sporego buforu i ich parsowanie.

2

W książce "Algorytmika praktyczna - nie tylko dla mistrzów" wykute było, że stosowanie cout/cin jest około pięć razy wolniejsze od printf/scanf. Mimo to nie skacz z balkonu i nie zmieniaj tak nagle życia swego, bo to bez sensu. Tego typu instrukcje akurat nie sprawią, że twój program zazna chwały i glorii. Wręcz przeciwnie stosując archaiczne konstrukcie wrócisz do problemów z którymi już dawno sobie poradzono. Nie wierzysz? To poczekaj, aż postrzelisz się z winny błędnie określonego specyfikatora typu.

1
Zjarek napisał(a)

Dodatkowo możesz przeciążać operator<< dla obiektów, co także poprawia czytelność kodu..

Tak, na pewno przeciążanie operatora przesunięcia bitowego poprawia czytelność. Dobrze też jest przeciążać dla stringa np. '++' jako uppercase i '/' jako split. Niech żyje spaghetti!

0

Thx za odp.
Jednak wciąż nie rozumiem dlaczego KOD1 ma lepszy czas wykonania od KOD2? skoro cin i cout są 5 razy wolniejsze od printf i scanf() ktoś już wcześniej napisał.

0

sorry chodzi mi odwrotnie dlaczego KOD2 ma lepszy czas wykonania od KOD1

0

dlaczego KOD2 ma lepszy czas wykonania od KOD1?

Dlatego, bo odpada przetwarzanie format stringów dla funkcji scanf i printf. W przypadku iostream rozpoznanie typu, a co za tym idzie dobranie odpowiedniej konwersji, następuje podczas kompilacji.

(...) skoro cin i cout są 5 razy wolniejsze od printf i scanf() ktoś już wcześniej napisał.

Bzdury!

0
Zjarek napisał(a)

Jeśli chodzi Ci o konkursy, używaj scanfa.

E tam. Wyłączenie synchronizacji strumienii ze standardowym wejściem / wyjściem (ios_base::sync_with_stdio(0)) i ciny/couty potrafią osiągnąć prędkość porównywalną ze scanfami/printfami, szczególnie gdy w zadaniu nie ma zbyt wielu danych na wejściu / wyjściu.

0
0x666 napisał(a)

dlaczego KOD2 ma lepszy czas wykonania od KOD1?

Dlatego, bo odpada przetwarzanie format stringów dla funkcji scanf i printf. W przypadku iostream rozpoznanie typu, a co za tym idzie dobranie odpowiedniej konwersji, następuje podczas kompilacji.

Dalej nic z tego nie rozumiem... może jest ktoś kto potrafi to wytłumaczyć w bardziej przystępny sposób?

0

Bo gdy masz printf("%d",zmienna), to w trakcie uruchomienia program parsuje stringa "%d" żeby wiedzieć, jak ma potraktować zmienną. A jeżeli masz cout<<zmienna, to w trakcie kompilacji następuje wiązanie i program wie, że ma wywołać wypisanie zmiennej typu int.

0

cout przy dużych ilościach wypisywanych danych jest szybszy od printf'a. Nie udało mi się uzyskać takiego efektu przy cin.

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