Jdbi: 自 3.5.1 版以来性能显着下降

创建于 2019-10-27  ·  5评论  ·  资料来源: jdbi/jdbi

我注意到当从 3.5.1 版到 3.10.1 版(Dropwizard 1.3.5 -> 2.0.X)时,在对具有 20 多个字段的 Java 类型使用 Java Beans 行和参数映射器时,性能显着下降。

我创建了一个微型基准程序: https :

最有用的评论

测试 3.11.1 - 与 3.5.1 相比提高了 20%! 做得好!
我将在 SnakeCase 匹配器上创建一个单独的问题,我们在那里讨论可能的解决方案。

所有5条评论

@Alexey1Gavrilov ,感谢您报告此事! 我同意肯定有一些倒退。

我开始致力于改善这种情况:https://github.com/jdbi/jdbi/pull/1607
目前,它只是在等待审查和一些测试,以确保我们不会破坏一切:)

您是否有时间独立验证上面链接的修复程序是否有助于您的用例?
谢谢,希望我们很快就会合并一个修复程序。

一个非常好的消息,您已经在进行改进! 我可以确认#1607 确实显着提高了性能。 我的微型基准程序使用该 PR 运行速度大约快 10-15%,然后在 3.5.1 上。 做得好!

我们还为列名匹配器实现了一个自定义缓存层,进一步提高了性能。 这个想法基本上是为Jdbi实例处理的所有字段缓存columnNamejavaName 。 这是一个代码片段:

class CachingColumnNameMatcher implements ColumnNameMatcher {
  private static class Column {
    final String columnName;
    final String javaName;

    private Column(String columnName, String javaName) {
      this.columnName = columnName;
      this.javaName = javaName;
    }

    <strong i="10">@Override</strong>
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      Column column = (Column) o;
      return Objects.equals(columnName, column.columnName) &&
          Objects.equals(javaName, column.javaName);
    }

    <strong i="11">@Override</strong>
    public int hashCode() {
      return Objects.hash(columnName, javaName);
    }
  }

  private final ColumnNameMatcher delegate;
  private final ConcurrentMap<Column, Boolean> cache;

  CachingColumnNameMatcher(final ColumnNameMatcher delegate) {
    this.delegate = delegate;
    this.cache = new ConcurrentHashMap<>();
  }

  <strong i="12">@Override</strong>
  public boolean columnNameMatches(final String columnName, final String javaName) {
    final Column key = new Column(columnName, javaName);

    return cache.computeIfAbsent(key, (c) -> delegate.columnNameMatches(columnName, javaName));
  }
}

...
    final ReflectionMappers reflectionMappers = jdbi.getConfig().get(ReflectionMappers.class);
    reflectionMappers.setColumnNameMatchers(
        reflectionMappers.getColumnNameMatchers().stream()
            .map(CachingColumnNameMatcher::new)
            .collect(Collectors.toList()));
...

如果我可以打开 PR,请告诉我缓存列名称比较是否对您有意义(它带有一些垃圾收集成本)。

@Alexey1Gavrilov ,我刚刚发布了包含 #1607 的 3.11.0。

我很高兴提高列名匹配的性能,尽管缓存所有匹配可能是一个重量级的解决方案。 您是否对特定的匹配器(可能是 SnakeCase 匹配器)有疑问? 让我们从对影响您的问题的更好描述开始,并设计一个解决方案,这可能是缓存:)

测试 3.11.1 - 与 3.5.1 相比提高了 20%! 做得好!
我将在 SnakeCase 匹配器上创建一个单独的问题,我们在那里讨论可能的解决方案。

太棒了,谢谢你!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Romqa picture Romqa  ·  5评论

raderio picture raderio  ·  6评论

anjeyy picture anjeyy  ·  3评论

bakstad picture bakstad  ·  5评论

buremba picture buremba  ·  5评论