如何改进成千上万个商品的循环销售? -格式化那么多项目的实际问题

时间:2019-02-12 03:55:43

标签: java arrays performance for-loop arraylist

我有一个树形图,其中包含300k +个元素,需要循环遍历。我原本希望这会花点时间,但是到了看起来好像挂着的地步。我插入了一个println语句来跟踪我在其中的位置,实际上,当到达某些点时,它暂停了一两秒钟,然后继续。最终(大约14万英寸),它完全停止,然后最终自行终止了该程序。

我正在尝试为我的项目创建树形图创建者和查看器。这是一棵n树,但并非所有分支都会有n个孩子。为了按照我的需要调整它,但是,我需要制作一棵完整的树,其中所有可能的子树都达到指定的大小,然后对其进行遍历以检查大小,更改大小,位置和存在。

//ArrayList<Button[]> buttons is passed in
double width = 0;
double height = 0;

Group g = new Group();
Scene s = new Scene(g);
    Button[] array = buttons.get(buttons.size() - 1);
    int temp = 1;
    for(int i = 0; i < array.length; ++i) {
        Button b = array[i];
        g.getChildren().add(b);
        g.applyCss();
        g.layout();
        width = width > b.getWidth() ? width : b.getWidth();
        height = height > b.getHeight() ? height : b.getHeight();
        g.getChildren().remove(b);
        System.out.println(temp++);
    }

编辑(因为我忘了说了):我首先尝试了一个for-each循环,但是它有相同的问题,交换给它看是否更好,并收到了相同的结果

编辑:滞后的主要来源已经是applyCSS()或layout()的来源,但我仍然很怀疑,因为它暂停了看似随机的低至16k的像素,并在其余所有像素中偶尔地暂停,直到死于170k之间。和300k

编辑:我已经通过忽略占位符按钮,从而几乎忽略了树中的所有内容来制定了自己的解决方案,但我一直保持开放态度,希望有人会知道实际的解决方案并将其发布,以便其他人也可以效益。目前的问题是弄清楚如何应用CSS并布局数十万个节点以确定其大小

2 个答案:

答案 0 :(得分:0)

不要考虑for-each循环和普通循环,数组列表和类似的微优化,这最多可能会花费一毫秒。迭代一百万个元素是完全便宜的,重要的是您对它们的处理方式。

这看起来像是内存泄漏,您的内存消耗似乎增加了,然后GC踢了一下,造成了微小的暂停,但是它无法回收足够的内存,因此它以越来越高的频率被调用,最后该进程死于这是徒劳的。

也许是添加然后删除的按钮可以保留一些其他信息,也许场景或小组可以。

尝试java -verbose:gc ...或从外部观看内存。在调试器中,检查组件以找出在g.getChildren().remove(b)之后发生了什么变化并保持不变。


考虑重新创建组件,也许每1000 Scene秒使用一个新的Group / Button或完全放下按钮。请注意,视觉元素不应长期存在,因此在需要时根据您的数据重新创建按钮应该是微不足道的(尚未显示的Button是便宜的数据结构(并且创建),而屏幕上的按钮可能会占用更多资源。

答案 1 :(得分:-1)

您是否尝试过使用增强的for循环?这是一个例子

for (int YourNumberHere : YourArrayHEre) 
{
    Button b = array[i];
    g.getChildren().add(b);
    g.applyCss();
    g.layout();
    width = width > b.getWidth() ? width : b.getWidth();
    height = height > b.getHeight() ? height : b.getHeight();
    g.getChildren().remove(b);
    System.out.println(temp++);
}