Witam,
mam pytanie, jak można się domyślić z tematu dotyczy najszybszych funkcji wejścia/wyjścia. Chodzi mi tutaj o funkcje szybsze od sprintf, scanf i cin, cout. Tylko błagam nie chcę tu zdań: po co Ci i tak nie zobaczysz różnicy.
Możesz całe wejście wciągać za pomocą fread() i wypisywać fwrite()
rozumiem, że męczysz SPOJ-a i trafiłeś na zadanie, gdzie wczytywanie danych staje się głównym przyczynkiem do czasu wykonania.
Niestety to jest największa wada SPOJ-a.
Tu masz przykład jak ja sobie radzę z tym problemem:
char buff[64];
char result[] = "0";
char *p;
int testCount;
gets(buff);
testCount = strtol(buff, &p, 10);
for (int i=0; i < testCount; ++i) {
gets(buff);
int day = strtol(buff, &p, 10)-1;
int a = strtol(p, &p, 10)%10;
int b = strtol(p, &p, 10)%10;
result[0] = '0' + moduloFibAB(day, a, b);
puts(result);
}
Znaj łaskę Pana.
http://ideone.com/VSg4G
Zależy do czego potrzebujesz to we/wy. Jeśli do plików, to najszybsze będzie mmap odpowiednio wsparte madvise, ale stosuje się je inaczej niż zwykłe strumienie we/wy. Ale to raczej jeśli piszesz soft bazodanowy, a nie do czytania jakiś drobiazgów typu konfiguracja. Do innych rzeczy najszybsze będą niskopoziomowe operacje takie jak posix read / write, bo one ograniczają się tylko do przekopiowania surowych danych do/z podanego bufora. Wszelkie rzeczy takie jak printf / scanf / cin / cout itp. są dość powolne, bo robią znacznie więcej (formatowanie, tokenizacja, itp.).
Podstawowa sprawa przy szybkim we/wy, niezależnie jakich funkcji użycjesz, to czytać dużymi paczkami, w praktyce przynajmniej 64 kB. Jak będziesz czytał po bajcie, to faktycznie możesz zajechać CPU samym wczytywaniem.