Najszybsze wczytanie znaku

0

Dobry wieczór. Mam do wczytania char (ktory moze przyjąc dwie kolejne wartosci w ASCII, to istotne) i porównac. Robie to w ten sposob:

if(getchar()&1) [...];
else;

Działa to dlatego, ze są to dwie kolejne wartosci w ASCII, jedna z nich jest zatem parzysta (wtedy getchar() & 1==0), druga nieparzysta (getchar() & 1==1). Jednak czy jest szybszy sposob od getchara i działania bitowego?
Jestem skłonny przyjąc najbardziej abstrakcyjne rozwiązanie, zależy mi na szybkości. 0.1s to dla mnie bardzo duzo.

2

Szybciej od getchar'a tylko odczyt z pliku o uchwycie (handle) 1, tylko nie wiem czy złapie przekierowanie.
Może pokombinuj z algorytmem a nie z pobieraniem danych.

0

Najwięcej czasu tracisz na odczytywaniu pojedynczych bajtów. Czytaj całymi blokami o rozmiarze co najmniej 512B (tyle wynosi rozmiar sektora dysku) lub wielokrotności tej wielkości.

0

Co zatem mogę zmienić w tej pętli? Dodawanie i odejmowanie jest najwolniejsze w moim programie wiec tu szukalbym optymalizacji.

While (a) 
{
if(getchar()&1) zmienna++;
else zmienna--;
a--;
} 
if(zmienna==0)[...];
0

jak sprawdziłeś, że to najwolniejsza operacja?
dodawanie i odejmowanie zajmuje jeden cykl pracy od ładnych kilku generacji procków.

0

Przyjmijmy, że jestem pewien. Nie wnikajmy w to.

2

Możesz zamienić:

While (a) 
{
if(getchar()&1) zmienna++;
else zmienna--;
a--;
} 

na:

zmienna -= a;
While (a) 
{
zmienna += (getchar()&1) * 2;
a--;
} 

Nietestowane.

Poza tym do wypróbowania: loop unrolling oraz wczytywanie do tablicy.

0

Getc i porównywanie do chara zamiast sprawdzania ostatniego bitu ma być szybsze?

0

Ja bym szedł w kierunku własnego buforowania. Pobierz kilka kilobajtów wejścia na raz do pamięci i z niej czytaj.

1
char tb[MaxVal]; // ewentualnie char *tb=new char[a]; lub dla C99 char tb[a];
fread(tb,1,a,stdin);
int zmienna=-a;
while(a) zmienna+=(tb[--a]&1)<<1;

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