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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
kris_12
Piegowaty Guziec
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

Post 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ć
Awatar użytkownika
dawwin
Serdeczny Borsuk
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

Post 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
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
Awatar użytkownika
JSokol
Sędziwy Jeż
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

Post autor: JSokol »

Poza tym zawsze możesz to zmierzyć starając się dla obydwu sposobów wyświetlania/pobierania zapewnić w miarę identyczne warunki :)
Awatar użytkownika
mario_7
Administrator
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

Post autor: mario_7 »

Obiektowość kosztuje, ale nie tyle, żeby z niej rezygnować.
Kokosek
Serdeczny Borsuk
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

Post autor: Kokosek »

Tutaj możesz popróbować http://www.spoj.pl/problems/INTEST/

A tak poza tym, możesz robić testy samodzielnie.
Kokos - po prostu, nie zdrabniaj ;)
mikolajs
Wytworny Kaczor
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

Post 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.
Awatar użytkownika
Hauleth
Wytworny Kaczor
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

Post 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.
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post 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.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Awatar użytkownika
Hauleth
Wytworny Kaczor
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

Post 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
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
beluosus
Zakręcona Traszka
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

Post autor: beluosus »

To już nie jest sprawa buforowania czy właściwości systemu tylko optymalizacji kompilatora. Bez optymalizacji printf wygrywa.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości