Kada keš raste u pogrešnom smeru
U ovom članku
Četiri male datoteke leže u keš direktorijumu ovog servisa. Najveća ima 35 bajtova. Zajedno sadrže tri broja brojača i čitaju se pri svakom zahtevu za brojač.
Postoje da putanja brojanja ne bi morala da postavlja bazi četiri pitanja na koja skoro uvek odgovori „ne“. Da li ovaj brojač isključuje posete svog vlasnika? Prati odlazne klikove? Prati putanje kroz sajt? Sam se ponovo učitava? Za više od 99% brojača svaki odgovor je ne, a datoteka sa šačicom brojeva gde je odgovor da jeftinija je za proveru od četiri indeksirana upita.
Jeste jeftinija. To je i vrsta jeftinog koja se preokrene.
Šta je mereno
Isto pitanje — „da li je ovaj brojač na listi?“ — postavljeno na dva načina, pri šest veličina liste. Način sa datotekom: pročitaj je, dekodiraj JSON, potraži broj. Način sa bazom: jedna pripremljena naredba nad indeksiranom kolonom. Po dve hiljade ponavljanja, pet krugova, uzeta medijana.
Pri današnjoj veličini datoteka pobeđuje osam puta: 0,0202 milisekunde prema 0,1630. Pri hiljadu brojeva izjednačeni su. Pri deset hiljada datoteka košta dvanaest puta više, a pri sto hiljada 135 puta više, jer je do tada to 578 kilobajta koje treba pročitati i obraditi pri svakom pregledu.
Linija baze se ne pomera. 0,16 milisekundi pri dva reda i 0,16 milisekundi pri sto hiljada: za to služi indeks, i lako je zaboraviti koliko se posla krije iza toga koliko ta linija izgleda dosadno.
Neprijatan deo
Presek je negde između 100 i 1.000 brojeva. Ovaj servis ima 2.218 brojača koji su bili aktivni u poslednjih trideset dana.
Dakle, kada bi funkcija isključivanja bila uspeh — kada bi svako ko ima brojač uključio „ne računaj moje posete“ — datoteka bi sadržala 2.218 brojeva, imala 11 kilobajta i koštala 0,43 milisekunde po pregledu umesto 0,02. Pri jučerašnjih 18.423 pregleda to je osam sekundi posla dnevno da se izbegne upit koji bi trajao tri.
Optimizacija je najbrža kada se funkcija najmanje koristi. Ne degradira postepeno sa opterećenjem, kao spor upit. Degradira sa usvajanjem, a to je jedina osa koju niko ne posmatra, jer je rast usvajanja valjda dobra vest.
Zašto je ipak tu
Zato što je danas ispravna, a „danas ispravno“ sme da bude razlog za nešto, sve dok je neko zapisao kada prestaje da važi.
Tri broja u tri datoteke. Osam puta jeftinije od alternative, na računaru gde je putanja brojanja jedino što mora da bude brzo. Zamena upitom koji ona pobeđuje bila bi gori sistem opravdan hipotezom.
Potreban je okidač upozorenja, a ne prepisivanje. Datoteka se ionako piše iz baze, kodom koji menja podešavanje — to je prirodno mesto da se primeti da je lista porasla preko nekoliko stotina unosa i da se to kaže. Keš sa dokumentovanim plafonom je odluka. Keš bez njega je opklada na koju niko nije pristao.
Opšti oblik
Ovo nije argument protiv keširanja u datoteci. To je argument da se zna u kom smeru keš raste.
Većina keševa postaje bolja pod opterećenjem: više zahteva, više pogodaka, bolji odnos. Ovaj je druge vrste. Njegova cena po zahtevu funkcija je količine podataka koje drži, a ono što drži raste sa onim što servis želi da podstakne. Svako čitanje plaća svaki unos, uključujući 2.215 onih koji nemaju veze sa posetiocem koji se upravo broji.
Pitanje koje treba postaviti svakoj tabeli za pretraživanje u memoriji ili u datoteci nije „koliko je brza“, nego „šta je čini većom i šta se dešava kada to krene dobro“. Ako je odgovor „postaje sporija“, ograničenje veličine pripada kodu, pored onoga što piše datoteku, na dan kada se pravi.