当前位置: 首页 > 知识库问答 >
问题:

为什么在多个循环中的Java进程的速度会变慢?

澹台宾白
2023-03-14

我在多核英特尔工作站上使用WIN7和Java8。我有这样的东西:

  int SampleWeeksArray[]=new int[]{23,25,33},IdArray[]=new int[]{0,1,2};

  for (int StartDay=25;StartDay<36;StartDay++)
    for (int SampleWeeks : SampleWeeksArray)
      for (int Id : IdArray)
        for (float ValueFactor=0.08f;ValueFactor<0.13f;ValueFactor+=0.01)
        {
          DataDigester dataDigester=new DataDigester();
          dataDigester.StartDay=StartDay;
          dataDigester.SampleWeeks=SampleWeeks;
          dataDigester.Id=Id;
          dataDigester.ValueFactor=ValueFactor;
          dataDigester.DoRun();
        }

在datadigester.dorun()中,它读取一些文本数据文件,解析每一行并对数组、向量和hashmaps进行一些统计,它使用ThreadPoolExecutor运行多个进程,然后将结果保存到一个文件中。

奇怪的是DoRun()的每一次运行只需要10分钟,但是在循环中,它开始的时间是10分钟。但逐渐减慢到20、30分钟。对于每个DoRun()。

   Thread.sleep(20*1000);                     // Rest for 20 seconds
   System.gc();

在每个循环中,datadigesterdatadigester=new DataDigester()创建一个新对象,它应该在DoRun()之后被回收,为什么它会变慢?

我还从Windows任务管理器中注意到,随着循环的不断进行,内存使用率也在上升。Java似乎在某种程度上给自己带来了负担,并变慢了,所以在这种情况下,如何将速度保持在10分钟不变。对于循环中的每次运行?

共有1个答案

姜锋
2023-03-14

如果不知道DataDigester是什么和做什么,很难说,但我可以想到一些可能的原因:

>

  • 如果datadigester.dorun启动一个新线程,那么随着线程数量的增加,每个线程的可用时间也会减少。如果它使用硬件线程,那么一旦每个硬件线程从1线程增加到2线程,时间就会显著增加。

    DataDigester可能有一个静态结构,它可以添加到该结构中,并且添加的越多,该结构的增长速度就越慢

  •  类似资料:
    • 迭代之间是否存在延迟?或者,换句话说,每秒将执行多少个无限循环?

    • 昨天我在python中使用多重处理处理了大约2000万行的日志文件。 启动名为“producer”的进程,逐行读取文件并将其放入队列 代码在下面 结果很奇怪,工作完成后,消费者进程不会终止,并且主函数在连接()处被阻塞。 使用以下不同的套装和代码进行测试: 使用test_get_ip()而不进行多处理来处理大小日志文件,效果很好 那么,有什么问题?列表中有限制吗?有什么我错过的吗? 我的机器环境是

    • 下面的代码取自一个用G++编译的示例。多线程比单线程快2倍。 我在Visual Studio2019中执行它,结果恰恰相反:单线程比多线程快2倍。 但是,如果我对我的函数做一个小的修改,如下所示: 多线程的性能更好。我想知道是什么导致了这种行为(在实现方面有哪些可能的差异解释了它)。 此外,我还使用www.onlinegdb.com上的gcc进行了编译,结果与我的计算机中的Visual Studi

    • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

    • 当我输入一个字符串运算符时,无论是加法()、减法(-)、乘法(*)、除法(/)还是模块(%),即使我输入了一个有效的输入,它仍然会进入而循环。我不知道问题可能是什么,因为当循环工作正常时,我必须为变量Num2输入一个int值。

    • 如果我有时运行这些程序,它会在打印“玩家赢”或“玩家输”后继续运行,我可以找到原因。。 这里的输出: 球员滚轴3 2=5 分数是5 玩家滚轮6 4=10 游戏者滚轴6=12 玩家滚轮5 5=10 球员滚轴12=3 球员滚轴1 3=4 球员获胜 球员滚轴4 6=10 球员滚轴4 1=5 构建成功(总时间:0秒)

    • 我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。 下面是我陷入的特定循环: 当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response=

    • 问题内容: 我在程序中看到了与程序中此特定循环相关的不同行为,但我不确定我为什么理解它的行为方式。 的输出是 的输出是 我去网上看了以下内容 在切片上进行测距时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处的元素的副本 它说一个副本,这是否意味着它返回了字符串的副本,但这实际上是指向变量的指针?在这种情况下,在循环结束时对will的任何引用都实际上引用了数组中的最后一个元素,例如?这是否