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

具有低代价任务的顺序和并行计算的性能

扶绍辉
2023-03-14

我有一个表示当前状态对象“cell”列表。

list currentCells=new arraylist ();

列表 >futures=TaskExecutor.InvokeAll(cells);

我知道并行解决一个问题总是需要一个开销。在这种情况下,它在我的循环中加速。你能推荐什么方法来加速我的循环?

共有1个答案

邢皓
2023-03-14

如果我将numberOfThreads从1更改为12(我最多有12个处理器),速度似乎不会有任何差别。我的循环的代码是:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import view.ConsolePrinter;

public class Engine implements Runnable {

    private int numberOfThreads = 8;
    private boolean shouldRun = false;
    private ExecutorService taskExecutor;
    private Thread loopThread;
    private List<Cell> cells;
    private World world;
    private int numberOfRunningTimeSteps = 0;
    private int FPS = 30;
    private double averageFPS;

    public Engine(List<Cell> cells, World world) {
        this.cells = cells;
        taskExecutor = Executors.newFixedThreadPool(numberOfThreads);
        this.world = world;
    }

    @Override
    public void run() {

        world.resetTime();
        shouldRun = true;

        long startTime;
        long estimatedTimeMillis;
        long waitTime;
        long totalTime = 0;
        long targetTime = 1000 / FPS;

        int frameCount = 0;
        int maxFrameCount = 1; 

        while (shouldRun) {

            startTime = System.nanoTime();

            try {
                List<Future<Cell>> futures = taskExecutor.invokeAll(cells);
                List<Cell> futureCells = new ArrayList<Cell>();

                futures.forEach((future) -> {
                    try {
                        futureCells.add(future.get());
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }

                });

                world.setCells(futureCells);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            world.timeProceeded();

            if (numberOfRunningTimeSteps != 0 && world.getTime() == numberOfRunningTimeSteps) {
                shouldRun = false;
            }

            estimatedTimeMillis = (System.nanoTime() - startTime) / 1000000;
            waitTime = targetTime - estimatedTimeMillis;
            try {
                if (waitTime > 0.0) {
                    Thread.sleep(waitTime);
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            totalTime += System.nanoTime() - startTime;
            frameCount++;
            if (frameCount == maxFrameCount) {
                averageFPS = 1000.0 / ((totalTime / frameCount) / 1000000);

                frameCount = 0;
                totalTime = 0;
            }
        }

    }

    public void start(int n) {
        loopThread = new Thread(this);
        loopThread.start();
        numberOfRunningTimeSteps = n;
    }

    public void stop() {
        shouldRun = false;

    }

}
 类似资料:
  • 我们有任务需要安排处理。每个任务由两部分组成,需要按顺序执行。第一个任务由互斥锁保护,因此一次只能执行一个任务。第二部分没有这样的约束,任何数量的任务都可以同时执行。对于任务,我们知道它需要在每个部分花费多少时间,即mi用于受保护的部分,ai用于可以并行执行的部分。 问题是找到任务的排列,以便最小化执行所有任务所需的时间。 我的直觉告诉我,这可以通过贪婪算法来解决,方法是按i的降序安排任务。 例如

  • 我正在将阻塞顺序编排框架转换为反应式。现在,这些任务是动态的,并通过JSON输入输入到引擎中。引擎提取类并执行方法,并使用每个任务的响应保存状态 如何在Reactor中实现相同的链接?如果这是一个静态DAG,我会将它与或操作符链接起来,但由于它是动态的,我如何继续执行反应性任务并收集每个任务的输出? 示例: 非反应性接口: 核心发动机 按照上面的示例,如果我将任务转换为返回Mono 更新:: 反应

  • 在一个私人开源项目中,我遇到了以下问题: 有各种各样的任务要执行。其中一些任务将具有 它们必须在一个或多个特定的其他任务之后执行 它们必须在一个或多个特定的其他任务之前执行 我在寻找一个简单的算法,如何利用这些信息构建一个有向图,然后可以用于周期检测,并以一个允许尊重所有这些条件的顺序执行所有任务。 问:什么是构建这样一个图的有效、好的方法? 谢谢你的帮助。 注意:很明显,我们需要在图中增加两个节

  • 问题内容: 我想找到更快的:结构与数组。因此,我编写了一个GO代码,在其中我将4个int值(1、2、3和4)写入一个结构的成员,然后写入一个长度为4的数组。我试图找出写入所需的时间。 案例1:首先,我将值写入结构,然后写入数组。在这里,我发现数组比结构要快。 情况2:其次,我将值写入数组,然后写入结构。在这里,我发现结构比数组要快。 为什么性能取决于我首先写的内容​​?我首先写的那个似乎慢一些。为

  • 我有一个数据流,其中事件的顺序很重要。时间特性设置为EventTime,因为传入记录中有时间戳。 为了保证排序,我将程序的并行度设置为1。当我的程序变得更复杂时,这会成为性能方面的问题吗? 如果我理解正确的话,我需要给我的事件分配水印,如果我想让流按时间戳排序的话。这很简单。但我读到即使这样也不能保证秩序?稍后,我想对那个流进行有状态计算。因此,为此我使用了一个FlatMap函数,它需要对流进行键

  • 问题内容: 我已经搜索了很多,但是找不到任何解决方案。我以这种方式使用Java线程池: 以这种方式,任务以随后的顺序执行(如在队列中)。但是我需要更改“选择下一个任务”策略。所以我想为每个任务分配优先级(不是线程优先级),并执行与这些优先级相对应的任务。因此,当执行者完成另一个任务时,它将选择下一个任务作为具有最高优先级的任务。它描述了常见问题。也许有一种更简单的方法没有说明优先级。它选择上一个添