java-all-call-graph icon indicating copy to clipboard operation
java-all-call-graph copied to clipboard

如何展示生成的链路

Open likunpeng003 opened this issue 3 years ago • 16 comments

大佬,有没有比较好的展示链路结果的插件吗

likunpeng003 avatar May 10 '22 12:05 likunpeng003

https://github.com/mermaid-js/mermaid 试过这个,就是层级太多了字体会被缩小了,看不清楚,而且没法拖动

image

Adrninistrator avatar May 10 '22 12:05 Adrninistrator

使用这个,处理链路数据的过程复杂吗

likunpeng003 avatar May 10 '22 12:05 likunpeng003

需要把生成的链路数据处理成什么格式呢,过程复杂吗

在 2022-05-10 20:35:26,"Adrninistrator" @.***> 写道:

https://github.com/mermaid-js/mermaid 试过这个,就是层级太多了字体会被缩小了,看不清楚,而且没法拖动

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

likunpeng003 avatar May 10 '22 12:05 likunpeng003

新建一个html文件,输入以下内容并保存

<body>
  <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
  <div class="mermaid">
graph LR
A1[test1] --> B[test2]
B --> C3[n]
B --> D[b]
  </div>
</body>

打开网页,生成效果如下所示: image

如果使用这种方式展示的话,需要自己按上述格式生成html文件

Adrninistrator avatar May 10 '22 12:05 Adrninistrator

https://github.com/mermaid-js/mermaid 试过这个,就是层级太多了字体会被缩小了,看不清楚,而且没法拖动

image

提供一些思路,使用https://github.com/mdaines/viz.js, graphviz 的js版本,研究一下subgraph的rank属性,可以通过一些算法策略控制,当某个深度太深的时候创建rank=same控制一下树的深度,并且可以根据字段数量设置合理的fontsize,并且可以设置合理的scale保证单个节点不会太小,可以大大优化可视效果。

除此之外,这是 https://github.com/nidi3/graphviz-java 的java版本,用纯Java直接生成图,只是把dot脚本换成了Java代码。集成之后开发者不需要去进行额外的工作就可以查看图。

jiangyongbing24 avatar May 17 '22 09:05 jiangyongbing24

https://github.com/mermaid-js/mermaid 试过这个,就是层级太多了字体会被缩小了,看不清楚,而且没法拖动 image

提供一些思路,使用https://github.com/mdaines/viz.js, graphviz 的js版本,研究一下subgraph的rank属性,可以通过一些算法策略控制,当某个深度太深的时候创建rank=same控制一下树的深度,并且可以根据字段数量设置合理的fontsize,并且可以设置合理的scale保证单个节点不会太小,可以大大优化可视效果。

除此之外,这是 https://github.com/nidi3/graphviz-java 的java版本,用纯Java直接生成图,只是把dot脚本换成了Java代码。集成之后开发者不需要去进行额外的工作就可以查看图。

感谢感谢,最近在加其他的功能,有空了研究下

Adrninistrator avatar May 17 '22 09:05 Adrninistrator

使用mermaid的flowchart,解析向下调用链,生成 n[class1:method1] n --> n.1.1[class2:method2] 如上类似的语法文本,mermaid可以生成svg图形,是可以随浏览器伸缩的 构造js类似如下,useMaxWidth:false时默认生成的图形就会大于显示器屏幕不至于太小了:

beanww avatar May 25 '22 08:05 beanww

mermaid的用法收到

对于被调用方法减少展示的感觉不是太好实现 看一下这个参数设成true以后,能不能减少一点重复被调用方法的信息,也有负作用,就是实际的调用信息会少展示

https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/resources/~jacg_config/config.properties

# 生成向下的调用链时,在一个调用方法中出现多次的被调用方法(包含自定义数据),是否需要忽略,true/false
ignore.dup.callee.in.one.caller

Adrninistrator avatar May 25 '22 08:05 Adrninistrator

mermaid的用法收到

对于被调用方法减少展示的感觉不是太好实现 看一下这个参数设成true以后,能不能减少一点重复被调用方法的信息,也有负作用,就是实际的调用信息会少展示

https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/resources/~jacg_config/config.properties

# 生成向下的调用链时,在一个调用方法中出现多次的被调用方法(包含自定义数据),是否需要忽略,true/false
ignore.dup.callee.in.one.caller

此参数确实可以减少很多重复调用日志

但是目前发现有一个坑需要留意,mermaid是一个js库,性能还是不行,我生成了一个1w多行的flowchart调用图,mermaid要转成svg图像花了好几个小时。。。也许使用graphviz这种有多语言接口的工具更好一些

beanww avatar May 30 '22 09:05 beanww

收到,现在还有一些优化功能在实现中(包含重点关注代码功能的图形化展示),等处理完以后,看看整个调用链的图形化展示怎么做比较合适

Adrninistrator avatar May 30 '22 09:05 Adrninistrator

一万多行?有多少个节点和边?这个数量级graphviz一样会用很久的,可以把源文件扔出来看一下?

jiangyongbing24 avatar May 30 '22 10:05 jiangyongbing24

sorry,没法上传内容

我说一下规模供参考:flowchart代码 1.6w行,每行都是类似 n.1-->n.1.1[yy]这样的边,整个就是一棵树,最深差不多20层左右,转完后1.8MB的文件会变为28MB的svg文件,耗时应该是2小时以上,具体我还没记下来

我还用mermaicli方式在后台生成,速度也是一样慢,因为整个过程只能占用一个cpu内核,我觉得这种纯cpu计算的操作,用java/c至少提高到半小时以内吧,

beanww avatar May 31 '22 02:05 beanww

sorry,没法上传内容

我说一下规模供参考:flowchart代码 1.6w行,每行都是类似 n.1-->n.1.1[yy]这样的边,整个就是一棵树,最深差不多20层左右,转完后1.8MB的文件会变为28MB的svg文件,耗时应该是2小时以上,具体我还没记下来

我还用mermaicli方式在后台生成,速度也是一样慢,因为整个过程只能占用一个cpu内核,我觉得这种纯cpu计算的操作,用java/c至少提高到半小时以内吧,

一万个边 + 一万个顶点规模的图属于很大的图了,本人正在用Java写一个graphviz的纯java版本,所以研究过布局算法+graphviz源码及相关论文,虽然没有研究过mermaid,但是这种有向图的布局一般来说都需要解决 层级分配,边交叉,节点横坐标设置等问题,其中边交叉 和 节点横坐标 是最耗时间的部分(graphviz是这样的,mermaid不确定),坐标计算的时候产生的辅助图是原图的几倍大小。 一个参考是,709个顶点 + 1028条边,在i7 9700k win10上,渲染了六分钟,所以可以预想到的是,你这种图用c语言写的graphviz来绘制的话估计也是按小时算的,所以真不能怪mermaid慢。

jiangyongbing24 avatar May 31 '22 03:05 jiangyongbing24

有基于neo4j把txt的调用内容直接展示出来的实践方案吗?

kingkong2019 avatar Jul 01 '23 07:07 kingkong2019