JMH - Бенчмаркинг Neo4j - PullRequest
       65

JMH - Бенчмаркинг Neo4j

0 голосов
/ 05 февраля 2019

В настоящее время я пытаюсь сравнить 2 различных реализации модели базы данных с использованием JMH, и одна из них - Neo4j.

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

Использование JMH:

Benchmark             Mode  Cnt     Score   Error  Units
Neo4j_JDBC.run        avgt       2434.298          ms/op
NEO4j_EMBEDDED.run    avgt          0.316          ms/op

В браузере Neo4j:

Started streaming 1 records after 2 ms and completed after 2 ms.

Запрос один и тот же, независимо от того, использую ли я встроенный сервер илиудаленный подключен с использованием JDBC.

JMH код:

@Setup
    public void setup() throws SQLException {
        con = DriverManager.getConnection("jdbc:neo4j:bolt://localhost", "neo4j", "password");
    }

    @TearDown
    public  void  tearDown() throws SQLException {
        con.close();
    }


    @Benchmark
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    @Measurement(iterations = 1, time = 1)
    @Fork(1)
    public void run() throws SQLException {
            String query = "query...";
            Statement st = con.createStatement();
            st.executeQuery(query);    
    }

Реализация взята прямо из документации

Противоположный случайдля второй модели данных, хотя, это использует сервер MySQL.

Там «реальная» скорость выполнения в DataGrip (которая также использует JDBC) составляет ~ 100 мс, а мой тест показывает около 1,6 мс / операций.

Я что-то упустил в своей конфигурации?

Это даже правильный способ сравнения различных систем баз данных с разными моделями?

Любая помощь приветствуется!

edit: я обновил код JMH, чтобы не измерять создание экземпляра соединения, и теперь я получаю следующие результаты при сравнении Neo4j с MySQL:

Benchmark                 Mode  Cnt   Score   Error  Units
MYSQL_JDBC.run            avgt        1.224          ms/op
Neo4j_JDBC.run            avgt       18.580          ms/op

Код MySQL почти такой же, как и выше, только сдругой URL JDBC.

Время выполнения в Datagrip для запроса MySQL:

1 row retrieved starting from 1 in 301ms (execution: 202ms, fetching: 99ms)

Очевидно, что чем чаще я его выполняю, тем быстрее он работает, но самым низким он был в Datagrip.45ms.Даже близко к 1,2 мс / оп, которые я измерял с помощью JMH.

Может это проблема с кешированием?Или это не правильно измеряет?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы также измеряете время, необходимое для установки соединения с базой данных в JMH, в то время как непосредственное взаимодействие с базой данных этого не делает.Попробуйте выполнить рефакторинг Соединения в поле и установить его перед выполнением тестов производительности.

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