Почему таймер, который запускается первым, самый медленный?

#java #mongodb

#java #mongodb

Вопрос:

Позвольте мне сначала объяснить, что я делаю, чтобы вам было легче предлагать мне решения.

У меня есть три конфигурации одной и той же базы данных в localhost (MongoDB), с которыми взаимодействует мое Java-приложение, и я должен рассчитать производительность в миллисекундах операций, которые Java-приложение выполняет с тремя базами данных, для этого я использую секундомер Google.

Проблема в том, что если я последовательно вычисляю время выполнения операций, таймер, который запускается первым, всегда самый медленный. Почему?

Это код:

 public void Find_By_Name(int number) {
        
        try {
            
            Generator generator = new Generator();
            Mongo mongo = new Mongo();
            Mongo_Export mongo_export = new Mongo_Export();
            Mongo_Export_2 mongo_export_2 = new Mongo_Export_2();
            Mongo_Export_3 mongo_export_3 = new Mongo_Export_3();
            
            generator.Generate_players(number);
            
            mongo.Drop_database("FootballStats");       //Drop Database_1. 
            mongo.Drop_database("FootballStats_2");     //Drop Database_2.  
            mongo.Drop_database("FootballStats_3");     //Drop Database_3. 
            
            ArrayList<Player> all_players = generator.getAll_players();
            ArrayList<Goalkeeper> all_goalkeepers = generator.getAll_goalkeepers();

            Stopwatch time = null;
            Stopwatch time_2 = null;
            Stopwatch time_3 = null;
            
            long ms = 0;
            long ms_2 = 0;
            long ms_3 = 0;
            
            mongo_export.Insert_players(all_goalkeepers, all_players);      // Insert documents in Database_1.
            mongo_export_2.Insert_players(all_goalkeepers, all_players);    // Insert documents in Database_2.
            mongo_export_3.Insert_players(all_goalkeepers, all_players);    // Insert documents in Database_3.
            
            /** Start timer Database configuration 1 */
            
            mongo_export.Find_by_name(all_goalkeepers, all_players);    //Search in the Database_1
            time.stop();
            /**----------------------------------------------------------------------*/
            
            /** Start timer Database configuration 2 */
            time_2 = Stopwatch.createStarted();
            mongo_export_2.Find_by_name(all_goalkeepers, all_players);  //Search in the Database_2
            time_2.stop();
            /**----------------------------------------------------------------------*/
            
            /** Start timer Database configuration 3 */
            time_3 = Stopwatch.createStarted();
            mongo_export_3.Find_by_name(all_goalkeepers, all_players);  //Search in the Database_3
            time_3.stop();  
            /**----------------------------------------------------------------------*/
            
            ms = time.elapsed(TimeUnit.MILLISECONDS);
            ms_2 = time_2.elapsed(TimeUnit.MILLISECONDS);
            ms_3 = time_3.elapsed(TimeUnit.MILLISECONDS);
            
            System.out.println("Timer for Database_1: "   ms   " ms.");
            System.out.println("Timer for Database_2:: "   ms_2   " ms.");
            System.out.println("Timer for Database_3:: "   ms_3   " ms.");
            
        } catch (Exception e) {
            
            System.out.println("Error in  Find_By_Name().");
            
        }
        
    }
  

Если, например, я сначала запускаю таймер для базы данных 2, это будет таймер с наибольшим значением по сравнению с таймером базы данных 1 и 3. И то же самое верно, если я сначала запускаю таймер базы данных 3.

Я также пытался не оценивать последовательно, а выполнять функцию по одному разу для каждой базы данных, и таким образом все базы данных находятся в одинаковых условиях и с одинаковой дельтой задержки, но при этом в 3 базы данных не вставляются одни и те же документы, потому что они генерируются случайным образом при каждом выполнении любой функции, и поэтому документы имеют разные размеры. Я бы хотел, чтобы во всех базах данных были одинаковые документы, а также одинаковое количество документов.

Я не хочу устранять «задержку», но я бы хотел, чтобы все базы данных оценивались на равных условиях. Есть решение?

Комментарии:

1. Может быть, это из-за того, как работает клиент Mongo? Если он создает какой-то «буфер» или «индекс» ленивым способом, это объяснило бы более длительный первый запуск

2. Я также думал, что это клиент Монго. И как я могу это исправить, чтобы у всех был одинаковый рейтинг?

3. Что делают различные Find_by_name функции?

4. mongo_export.Find_by_name() просто найдите документ, используя поле «название».