Performance 使用JGraphT版本0.8.2构建图形比使用版本1.3.0更快

Performance 使用JGraphT版本0.8.2构建图形比使用版本1.3.0更快,performance,version,jgrapht,Performance,Version,Jgrapht,我正在构建一个超过90000条边的图形: DefaultDirectedGraph graph = ... graph.addVertex(keyFrom); graph.addVertex(keyTo); graph.addEdge(keyFrom, keyTo); 对于新版本,我有以下结果: 构建图耗时13596毫秒边数:90469 构建图占用14354毫秒边数:94309 BUILD_GRAPH占用6647毫秒边数:90465 对于旧版本,我有以下结果: 构建图耗时5081毫秒边数

我正在构建一个超过90000条边的图形:

DefaultDirectedGraph graph = ...
graph.addVertex(keyFrom);
graph.addVertex(keyTo);
graph.addEdge(keyFrom, keyTo);
对于新版本,我有以下结果:

  • 构建图耗时13596毫秒边数:90469
  • 构建图占用14354毫秒边数:94309
  • BUILD_GRAPH占用6647毫秒边数:90465
对于旧版本,我有以下结果:

  • 构建图耗时5081毫秒边数:90469
  • 构建图占用3949毫秒边数:94309
  • 构建图占用4351毫秒边数:90466
探查器告诉我,此代码在库中的速度很慢:

UniformIntrusiveEdgesSpecifics:
 return edgeMap.putIfAbsent(e, intrusiveEdge) == null;
我试图改进vertex的哈希代码。但这没有帮助。 我想切换到lib的新版本。但性能是一个问题。你知道为什么新版本的lib速度较慢吗?

我发现:

  • 该图没有90000条大边,但它有300万条边!只有使用大图,您才能观察到性能上的差异
  • 如果覆盖图表的containsEdge方法,则旧版本的性能是新版本的三倍

    新的DefaultDirectedGraph(StandardFieldConnKeyEdge.class){

        @Override
        public StandardFieldConnKeyEdge addEdge(final GraphNode sourceVertex, final GraphNode targetVertex) {
            return super.addEdge(sourceVertex, targetVertex);
    
        }
    
        @Override
        public boolean containsEdge(final GraphNode sourceVertex, final GraphNode targetVertex) {
            return false;
        }
    
    };
    

我有一个eclipse项目,它显示了这个问题!

你能将这个问题发布到我们的github问题跟踪器上吗:在stackoverflow上用Q&a格式解决这个问题可能有点困难。在0.8.2和1.3.0之间做了很多更改。通常,1.3.0中的默认图需要更多的内存空间来构建,但最常见的图是Q查询速度更快。我们需要更多信息。