java - 并行处理何时克服顺序处理?

标签 java parallel-processing

//    parallel processing

    int processors = Runtime.getRuntime().availableProcessors();
    ExecutorService executorService = Executors.newFixedThreadPool(threads);


    final List<String> albumIds2 = new ArrayList<String>();
    long start2 = System.nanoTime();
    for (final HColumn<String, String> column : result.get().getColumns()) {
        Runnable worker = new Runnable() {

            @Override
            public void run() {
                albumIds2.add(column.getName());
            }
        };
        executorService.execute(worker);
    }
    long timeTaken2 = System.nanoTime() - start2;

我有类似上面示例的代码,它创建了一个 List<String>专辑 ID。 该列是来自 cassandra 数据库的切片。 我记录了创建整个相册列表所花费的时间。

我已经使用增强的 for 循环完成了相同的操作,如下所示。

        QueryResult<ColumnSlice<String, String>> result =  CassandraDAO.getRowColumns(AlbumIds_CF, customerId);
    long start = System.nanoTime();
    for (HColumn<String, String> column : result.get().getColumns()) {
        albumIds.add(column.getName());
    }
    long timeTaken = System.nanoTime() - start;

我注意到,无论专辑数量有多大,for each 循环总是需要更短的时间才能完成。我做错了吗?或者我需要一台多核计算机。我对并行计算的整个概念真的很陌生,如果我的问题很愚蠢,请原谅我。

最佳答案

在您的并行示例中,您要为每一列提交一个任务。排队任务的开销可能大于并行执行的好处。 “任务”实际上是一个快速任务(将单个元素插入数组并返回),这加剧了这种情况。实际上,Executor 将每个接收到的任务添加到一个队列中(而且这种添加的成本很高)。然后将 N 个任务添加到队列中,每个任务向数组添加一个元素。并发操作只执行后一部分

如果任务更复杂,您可以以“ block ”形式提交工作(例如,如果您有 N 个元素和 P 个处理器,则每个 block 将包含 N/P 个元素或 N/P+1 个元素)。该策略有助于减少开销。

另请注意,ArrayList 不是同步的,因此多个任务的并发执行可能会破坏您的列表。您可以使用并发集合来避免此问题,但第一个观察结果仍然存在。

关于java - 并行处理何时克服顺序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458916/

相关文章:

java - 我的输出只是给出奇怪的字符

java - 为什么 Git Bash 没有使用 PATH 环境变量中定义的正确 Java 路径?

python - 使用Python的高性能计算项目

python - ipyparallel 奇怪的开销行为

java - 使用 Elasticsearch Java API 运行文本查询

java - java的关键字参数?你怎么认为?

java - else 语法错误

multithreading - 多核 CPU 上能否真正同时执行 2 条指令

python - 如何在Python中正确使用多进程

c - CUDA 上的定时内核执行