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.