Прямой доступ к объекту = 94,117 раз быстрее, чем чтение из файла? - PullRequest
0 голосов
/ 29 августа 2018

Я написал небольшой класс, который в основном получает данные из CSV-файла и загружает их в объект POJO. Так как мне нужен частый доступ к этим данным, я написал одноэлементный класс, который проверяет, есть ли данные в объекте, и если да, он просто возвращает данные непосредственно из объекта (без необходимости снова получать их из файла). В противном случае он извлекает данные из файла и сохраняет данные в объекте для будущих запросов.

При тестировании я заметил, что примерно 10000 миллисекунд требуется для доступа к данным 10000 раз (включая первую загрузку данных из файла).

Что меня поразило, так это то, что когда я зацикливался 20 000 раз, это занимало всего 177 миллисекунд (всего на две миллисекунды больше, чем 10000 раз), а 50000 раз - всего около 197 миллисекунд.

Каково объяснение, что намного быстрее сделать 50К против 10К? Почему время не увеличивается пропорционально?

Кроме того, почему доступ к данным непосредственно с объекта гораздо быстрее, чем к диску (с помощью файла, это занимает около 160 миллисекунд за один раз)

Спасибо

Обновление:

Возможно, еще большее недоумение вызывает тот факт, что когда я пытаюсь получить доступ к объекту с помощью двух разных ключей (что требует двух чтений из файла), это занимает примерно столько же времени (с вариацией в 1 миллисекунду), чем один раз. Все объяснения относительно того, что доступ к объектам в 200К раз быстрее, чем доступ к файлам, объясняют только мое первое наблюдение, но сейчас я фактически читаю данные из двух разных файлов, но не вижу пропорционального увеличения количества времени, которое требуется.

Другими словами, делая это:

    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

    }

Почему время не увеличивается пропорционально?

1 Ответ

0 голосов
/ 29 августа 2018

Чтение файла с диска намного медленнее, чем чтение данных из памяти. Существует довольно хороший ресурс под названием " Latency Numbers, который каждый разработчик должен знать ", который объясняет часть этого. По сути, чтение 1 МБ с диска примерно в 200 000 раз медленнее, чем чтение из основной памяти.

Что касается того, почему вы видите более быстрое время отклика от вашего метода - вероятно, включился Hotspot (внутренний компилятор JVM). Когда вы часто выполняете метод в Java, JVM обнаружит это после некоторого порога (я хочу сказать, что это около 10 тыс. вызовов, но не верьте мне) и оптимизируйте метод. Это делается путем преобразования интерпретированного байт-кода, который вы выполняли, во встроенную сборку. Это намного быстрее и происходит за кулисами. Написание таких микробенчмарков, как у вас, исключительно сложно, и есть много способов испортить это. Ознакомьтесь с этим ресурсом от Oracle, чтобы узнать о некоторых подводных камнях и о том, как их избежать с помощью инструмента под названием JMH, если вы заинтересованы в дальнейшем изучении этих чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...