Szybkie wpisywanie do konsoli

0

Witam! Piszę aplikację konsolową o nazwie Choinka. Jednym z funkcji mają być migające lampki. Napisałem do tego odpowiedni algorytm, ale niestety szybkość z jaką program wypisuje tekst(choinkę) nie jest duża, co powoduje okropne miganie. Do wypisywania tekstu używam strumieni (cout). Funkcja odpowiedzialna za rysowanie wyświetla znaki z vectora vectora ( vectro < vector <char> >) i podwójnej pętli for.
Czy macie jakieś pomysły, aby wypisywanie tekstu odbywało się szybciej (najlepiej natychmiastowo)?

Pozdrawiam.

0

Wyłączenie synchronizacji może coś pomoże http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/

0

Edytowałem post, ale nie mogłem zapisać bo ktoś dodał odpowiedź:
Zaraz po napisaniu tego posta doznałem olśnienia ;) Rozwiązałem to poprzez pakowanie tych vectorów vectora <char> to jedengo vectora <String>.

0
matek3005 napisał(a)

Wyłączenie synchronizacji może coś pomoże http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/

Nie prawda. Przy wypisywaniu danych synchronizacja i buforowanie pomaga (zależy od obciążenia), mój kod testowy:

#!/bin/bash

times=1000000 # liczba iteracji
main="int main(){"
loop=" for(int i = 0; i < $times; i++) "
end=" return 0;}"
CXX=g++
FLAGS=-O2

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

echoc "@{og}Wyjście:"

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

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

echo -e "#include<cstdio> \n$main $loop printf(\"%d\", i);$end" > $file
echo -e "\nprintf()"
$CXX -o $ofile $file $FLAGS
time ./$ofile > /dev/null


echoc -en "\n@{og}Wejście:"

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

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

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

A out:

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

real	0m0.081s
user	0m0.077s
sys	0m0.003s

std::cout z sync_with_stdio(0)

real	0m0.075s
user	0m0.073s
sys	0m0.000s

printf()

real	0m0.101s
user	0m0.100s
sys	0m0.000s

Wejście:
std::cin bez sync_with_stdio(0)

real	0m0.918s
user	0m0.870s
sys	0m0.010s

std::cin z sync_with_stdio(0)

real	0m0.311s
user	0m0.310s
sys	0m0.000s

scanf()

real	0m0.112s
user	0m0.107s
sys	0m0.003s
0
winerfresh napisał(a)

Przy wypisywaniu danych synchronizacja i buforowanie pomaga (zależy od obciążenia)

tutaj twierdzą co innego, tutaj również. O buforowaniu nic nie pisałem. Osobiście nie wydaje mi się aby synchronizacja w wypadku problemu autora miała jakiś wpływ na szybkość (dlatego napisałem "może coś pomoże") jednak jeśli ma jakiś wpływ to myślę, że jej włączenie może mieć negatywne skutki. Przy tak małej ilości danych testowych wyniki nie są miarodajne.

0

Bez kodu niewiele można powiedzieć. Ale dwie wskazówki:
[1] Zamiast vector<vector<char>> spróbuj trzymać vector<string>, albo chociaż konwertuj "wewnętrzny" wektor na string przed wypisaniem.
[2] Nie nadużywaj endl albo flush. To powoduje opróżnienie bufora, często przedwcześnie, i wydłuża czas wypisywania. Zamiast endl wypisuj po prostu znak nowej linii (\n).

0

Do wypisywania tekstu używam strumieni (cout).
printf jest często znacznie szybsze niż cout.
ponadto, choć to zależy od konkretnego kompilatora i flag optymalizacji, wyraźnie szybsze może być printf("%s","napis") niż printf("napis").
no i jak kol. ricewind powiedział, jeśli już używasz cout to unikaj endl.

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