C++ Std::Cin i std::cout a printf i scanf
-
- Piegowaty Guziec
- Posty: 26
- Rejestracja: 20 gru 2009, 19:18
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
C++ Std::Cin i std::cout a printf i scanf
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ć
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ć
- dawwin
- Serdeczny Borsuk
- Posty: 202
- Rejestracja: 18 kwie 2009, 09:16
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Odp: C++ Std::Cin i std::cout a printf i scanf
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
Czas wykonywania się będzie na pewno bardzo podobny. Aczkolwiek drukowanie na ekran jest stosunkowo powolne w obydwu przypadkach
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
Nie pomagam na PW
- JSokol
- Sędziwy Jeż
- Posty: 67
- Rejestracja: 18 mar 2010, 10:57
- Płeć: Mężczyzna
- Wersja Ubuntu: 14.04
- Środowisko graficzne: Unity
- Architektura: x86_64
- Lokalizacja: Down under
- Kontakt:
Odp: C++ Std::Cin i std::cout a printf i scanf
Poza tym zawsze możesz to zmierzyć starając się dla obydwu sposobów wyświetlania/pobierania zapewnić w miarę identyczne warunki 

- mario_7
- Administrator
- Posty: 8655
- Rejestracja: 30 sie 2006, 13:11
- Płeć: Mężczyzna
- Wersja Ubuntu: 20.04
- Środowisko graficzne: GNOME
- Architektura: x86_64
Odp: C++ Std::Cin i std::cout a printf i scanf
Obiektowość kosztuje, ale nie tyle, żeby z niej rezygnować.
-
- Serdeczny Borsuk
- Posty: 108
- Rejestracja: 04 mar 2009, 20:44
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Odp: C++ Std::Cin i std::cout a printf i scanf
Tutaj możesz popróbować http://www.spoj.pl/problems/INTEST/
A tak poza tym, możesz robić testy samodzielnie.
A tak poza tym, możesz robić testy samodzielnie.
Kokos - po prostu, nie zdrabniaj 

-
- Wytworny Kaczor
- Posty: 352
- Rejestracja: 15 paź 2008, 18:30
- Płeć: Mężczyzna
- Wersja Ubuntu: 9.04
- Środowisko graficzne: KDE Plasma
Odp: C++ Std::Cin i std::cout a printf i scanf
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.
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.
- Hauleth
- Wytworny Kaczor
- Posty: 382
- Rejestracja: 18 sie 2008, 17:43
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: C++ Std::Cin i std::cout a printf i scanf
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.
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].
Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: C++ Std::Cin i std::cout a printf i scanf
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/mikolajs pisze:Iostream może być czasami szybszy bo jest buforowany.
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.
- Hauleth
- Wytworny Kaczor
- Posty: 382
- Rejestracja: 18 sie 2008, 17:43
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: C++ Std::Cin i std::cout a printf i scanf
Własny benchmark:
Kod skryptu:
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: 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
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].
Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Odp: C++ Std::Cin i std::cout a printf i scanf
To już nie jest sprawa buforowania czy właściwości systemu tylko optymalizacji kompilatora. Bez optymalizacji printf wygrywa.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości