#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()
просто найдите документ, используя поле «название».