Strona 1 z 1

C++ Std::Cin i std::cout a printf i scanf

: 16 paź 2010, 22:46
autor: kris_12
Jakie są różnice w szybkości działania funkcji std::cout i std::cin a funkcjami printf i scanf.
Bo jestem przyzwyczajony do cinów i coutów, a ktoś mi powiedział że spowalniają one działanie programów, a trudno mi się odzwyczaić

Odp: C++ Std::Cin i std::cout a printf i scanf

: 16 paź 2010, 22:53
autor: dawwin
W C++ używamy cin i cout a w C scanf i printf.
Czas wykonywania się będzie na pewno bardzo podobny. Aczkolwiek drukowanie na ekran jest stosunkowo powolne w obydwu przypadkach

Odp: C++ Std::Cin i std::cout a printf i scanf

: 16 paź 2010, 23:38
autor: JSokol
Poza tym zawsze możesz to zmierzyć starając się dla obydwu sposobów wyświetlania/pobierania zapewnić w miarę identyczne warunki :)

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 00:02
autor: mario_7
Obiektowość kosztuje, ale nie tyle, żeby z niej rezygnować.

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 10:38
autor: Kokosek
Tutaj możesz popróbować http://www.spoj.pl/problems/INTEST/

A tak poza tym, możesz robić testy samodzielnie.

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 14:51
autor: mikolajs
Raczej nie będzie dużej różnicy w szybkości, bo najwięcej czasu zajmować będzie komunikacja z systemem. Iostream może być czasami szybszy bo jest buforowany.
Na pewno użycie cin i cout powiększy bardzo kod programu, dlatego jeżeli zależy Ci na rozmiarze pliku wynikowego to ich nie używaj.
PS. To "bardzo powiększy" to pewnie będzie kilkadziesiąt KiB.

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 15:31
autor: Hauleth
Różnica jest duża przy wczytywaniu na niekorzyść IOstreams. Z kolei przy wypluwaniu na ekran to streamsy bywają czasami szybsze ze względu na buforowanie wyjścia.

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 15:37
autor: beluosus
mikolajs pisze:Iostream może być czasami szybszy bo jest buforowany.
Nigdy nie będzie szybszy. Jeśli sam nie wyłączysz buforowania to printf też buforuje. Ogólnie jeśli chodzi o kilkakrotne wczytanie/wypisanie danych to nie zauważysz różnicy. Podam taki przykład ze wspomnianego wyżej spoja, jest takie zadanko: https://pl.spoj.pl/problems/NIEKOLEJ/
Program napisany w C++ wykonywał się 0.17s, w C 0.09s (prawie 2x szybciej), natomiast po wprowadzeniu pewnej sztuczki zszedłem do 0.08.
Teraz sam zdecyduj na czym Ci zależy.

PS
Zawsze jest jeszcze write i read. ;)

EDIT:
Widzę, że kolejna osoba twierdzi, że iostream potrafi być szybsze. Może się mylę, proszę o przykład w takim razie.

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 20:42
autor: Hauleth
Własny benchmark:

Kod: Zaznacz cały

Wyjście:
std::cout bez sync_with_stdio(0)

real    0m0.218s
user    0m0.220s
sys    0m0.000s

std::cout z sync_with_stdio(0)

real    0m0.223s
user    0m0.224s
sys    0m0.000s

printf()

real    0m0.225s
user    0m0.220s
sys    0m0.004s

Wejście:

std::cin bez sync_with_stdio(0)

real    0m1.084s
user    0m1.080s
sys    0m0.004s

std::cin z sync_with_stdio(0)

real    0m0.298s
user    0m0.288s
sys    0m0.012s

scanf()

real    0m0.319s
user    0m0.308s
sys    0m0.012s
Kod skryptu:

Kod: Zaznacz cały

#!/bin/bash

powt=1000000 # liczba iteracji
main="int main(){"
petla=" for( int i = 0; i < $powt; i++ ) "
end=" return 0;}"

file=test.cpp # plik do kompilacji
ofile=test.out # wyjściowy plik uruchomieniowy

ifile=test.in # pilik z danymy wejściowymi

if [ ! -e $ifile ]
then
    seq 0 $powt > $ifile
fi

echo "Wyjście:"

echo -e "#include<iostream> \n$main $petla std::cout << i;$end" > $file
echo "std::cout bez sync_with_stdio(0)"
g++ -o $ofile $file -lm -O2
time ./$ofile > /dev/null

echo -e "#include<iostream> \n$main std::ios_base::sync_with_stdio(0); $petla std::cout << i;$end" > $file
echo -e "\nstd::cout z sync_with_stdio(0)"
g++ -o $ofile $file -lm -O2
time ./$ofile > /dev/null

echo -e "#include<cstdio> \n$main $petla printf(\"%d\", i);$end" > $file
echo -e "\nprintf()"
g++ -o $ofile $file -lm -O2
time ./$ofile > /dev/null


echo -e "\nWejście:"

echo -e "#include<iostream> \n$main $petla {int test; std::cin >> test;}$end" > $file
echo -e "\nstd::cin bez sync_with_stdio(0)"
g++ -o $ofile $file -lm -O2
time ./$ofile < $ifile

echo -e "#include<iostream> \n$main std::ios_base::sync_with_stdio(0); $petla {int test; std::cin >> test;}$end" > $file
echo -e "\nstd::cin z sync_with_stdio(0)"
g++ -o $ofile $file -lm -O2
time ./$ofile < $ifile

echo -e "#include<cstdio> \n$main $petla {int test; scanf(\"%d\", &i);}$end" > $file
echo -e "\nscanf()"
g++ -o $ofile $file -lm -O2
time ./$ofile < $ifile

Odp: C++ Std::Cin i std::cout a printf i scanf

: 17 paź 2010, 22:42
autor: beluosus
To już nie jest sprawa buforowania czy właściwości systemu tylko optymalizacji kompilatora. Bez optymalizacji printf wygrywa.