_asd napisał(a)
- nie używać nigdy zsynchronizowanego (czyli defaultowego) cin/cout
- w przypadku pracy z liczbami nie używać nigdy scanf(...) - zastąpić to własnym fragmentem kodu - ascii na int-y można przetworzyć w ten sposób o wiele szybciej /u mnie poprawiło to wynik o kilkanaście setnych ms);
- niczego nie mallocować - zazwyczaj spokojnie można zmieścić się w limitach pamięci deklarując tablice globalne.
- samemu formatować text wyjściowy i..
- ..jeśli to możliwe, batchować we własnej tablicy tekst wyjściowy i 'printować' go w 10 lub 100 partiach bez formatowania zamiast 10000-100000 razy z formatowaniem.
No i te rady okazały się stety/niestety trafiać w samo sedno :D
Różnice są od razu widoczne (między programami tutaj już umieszczonymi) co skłoniło mnie do implementacji "mini" klas do obslugi wejscia i wyjscia
z buforowaniem i własnym parserem
(kod wyszedl dosyck dlugi, ale wstawiam maly fragment)
#include <stdio.h>
#include <string.h>
#define max_buf_simpleinput 70
#define max_buf_simpleoutput 100000
//#define tryFlushing 1
class SimpleInput
{(...)};
class SimpleOutput
{(...)};
int main() {
static SimpleInput in;
static SimpleOutput out;
while (in.getLine())
{
out.putInt(in.nextInt()*in.nextInt()*2);
out.putChar('\n');
}
out.flush();
return 0;
}
Uzyskany czas to 0.012.
1.67 razy szybszy niz 'najszybszy' do tej pory kod
i 10 razy niż najwolniejszy
Nadal daleko do 0.00, ale nic nie było tablicowane tylko podrasowane samo i/o.
//Nie mozna, by bylo sprawdzac zadania na podstawie ile cykli procesora zabralo programowi dojscie do konca? bylo by to bardziej miarodajne, bo mozliwe jest, ze ludzie trafiaja na niski load :P