Написах малък клас, който основно извлича данни от CSV файл и ги зарежда в POJO обект. Тъй като имам нужда от чест достъп до тези данни, написах единичен клас, който проверява дали данните вече са в обекта и ако да, просто връща данните директно от обекта (без да е необходимо да ги получава отново от файла). В противен случай той извлича данни от файл и съхранява данни в обект за бъдещи заявки.
При тестване забелязах, че са необходими приблизително 175 милисекунди за достъп до данните 10 000 пъти (включително първия път, който зарежда данните от файл).
Това, което ме порази, беше, че когато зациклих 20 000 пъти, това отне само 177 милисекунди (само две милисекунди повече от 10 000 пъти), а 50 000 пъти отне само около 197 милисекунди.
Какво е обяснението, че е много по-бързо да се направи 50K срещу 10K? Защо времето не се увеличава пропорционално?
Също така защо достъпът до данни директно от обект е много по-бърз от достъпа до него от диск (когато имам достъп до него чрез файл, това отнема около 160 милисекунди за един път)
Благодаря
Актуализация:
Може би още по-объркващо е, че когато се опитвам да осъществя достъп до обекта с помощта на два различни ключа (което изисква две четения от файл), това отнема приблизително същото време (с вариация от 1 милисекунда), отколкото достъпът до него веднъж. Всички обяснения, че достъпът до обекти е 200K пъти по-бърз от достъпа до файлове, обясняват само първото ми наблюдение, но сега всъщност чета данни от два различни файла, но не виждам пропорционално увеличение на времето, което отнема.
С други думи, правейки това:
for (int counter = 0; counter < 1; counter++) {
POJOObj.getInstance().getKey("Key1", "Val1");
}
отнема същото време като това:
for (int counter = 0; counter < 1; counter++) {
POJOObj.getInstance().getKey("Key1", "Val1");
POJOObj.getInstance().getKey("Key1", "Val2"); // this requires new read from file
}
Защо времето не се увеличава пропорционално?