Java 一个线程何时会比多个线程同时运行快

Java 一个线程何时会比多个线程同时运行快,java,multithreading,concurrency,Java,Multithreading,Concurrency,对于分配,我必须实现一个Java程序,当使用多个线程运行时,实际上要比仅使用1个线程运行时慢。我知道创建线程需要一些开销,但在本例中,我处理的是一个大数组20000x2000。因为没有依赖关系,所以创建4个较小的块并同时运行它们的好处应该总是超过创建线程的成本,对吗 for (int i = 0; i < numThreads; i++) { // for each iteration of the body's for loop, // calculate the starting a

对于分配,我必须实现一个Java程序,当使用多个线程运行时,实际上要比仅使用1个线程运行时慢。我知道创建线程需要一些开销,但在本例中,我处理的是一个大数组20000x2000。因为没有依赖关系,所以创建4个较小的块并同时运行它们的好处应该总是超过创建线程的成本,对吗

for (int i = 0; i < numThreads; i++) {

// for each iteration of the body's for loop,
// calculate the starting and ending indexes
// of the ith chunk of the y dimension of
// the anArray array
final int indexStart = i * chunkSize;
final int indexEnd = (i + 1) * chunkSize;

// each "execute" method of the Executor class
// creates a new object of type Runnable ...
// be careful with the parentheses here ... the
// entire next code block is being passes
// as a parameter to the execute method
ex.execute(new Runnable() {

    // The run() method is declared abstract in the Runnable
    // class, so it MUST be overriden. The body of the
    // run method is the "code" that each thread executes
    @Override
    public void run() {

        for (int j=0; j<anArray.length; j++){
        for (int k = indexStart; k < indexEnd; k++){
                            anArray[j][k] = anArray[j][k] * anArray[j][k] / 3.45 * Math.sqrt(anArray[j][k]);

                        }

        } // end for

    } // end run
    }
    );
}
for(int i=0;i
多线程在独立运行时工作得最好。这意味着对共享资源的任何过度利用都会限制甚至降低多线程的使用速度

假设您有一个具有4个内核的套接字。这意味着您有4个内核,每个内核具有32 KB的一级缓存。如果您使用的内存超过此数量,则它们必须使用二级缓存,其速度大约为3-4倍。但这些内存仅为256 KB。如果您使用的内存超过此数量,则它们必须使用一个且仅一个三级缓存。即,一个端口使用的内存超过1 MBd您的应用程序不再可扩展,可能会更慢

在您的情况下,您还使用浮点单元esp Math.sqrt,它占用了相当多的CPU。每个内核只有一个FPU,因此您可能会发现使用超线程不会有多大帮助。(也许 我做了一些研究,发现你可以用一个线程使用大部分的cpu,所以创建更多的线程是没有帮助的,这是怎么可能的

多线程在独立运行时工作得最好。这意味着对共享资源的任何过度利用都会限制甚至降低多线程的使用速度

假设您有一个具有4个内核的套接字。这意味着您有4个内核,每个内核具有32 KB的一级缓存。如果您使用的内存超过此数量,则它们必须使用二级缓存,其速度大约为3-4倍。但这些内存仅为256 KB。如果您使用的内存超过此数量,则它们必须使用一个且仅一个三级缓存。即,一个端口使用的内存超过1 MBd您的应用程序不再可扩展,可能会更慢

在您的情况下,您还使用浮点单元esp Math.sqrt,它占用了相当多的CPU。每个内核只有一个FPU,因此您可能会发现使用超线程不会有多大帮助。(也许 何时1个线程的运行速度会比多个线程并发运行的速度快

以下是一些:

  • 如果您正在创建自己的线程:当在每个线程上创建和启动N个线程以及运行M个任务所花费的时间大于在单个线程上运行N*M个任务所花费的时间时。提示:启动Java线程代价高昂

  • 如果您使用的是
    执行器
    ,则计划任务所需的时间对于执行任务来说非常长

  • 提示:多线程(用于绑定计算的任务)所能获得的加速受内核数量而不是线程数量的限制

  • 当任务具有固有的并发瓶颈时,例如访问/更新公共同步数据结构

  • 当任务涉及跨多个线程访问大量内存单元时,会出现大量内存缓存未命中和内存争用

  • 当您在基准测试中出错时;例如,当您没有适当考虑“JVM预热”效应时


  • 在这种情况下,我认为多线程比单线程好,因为我们有更多的内核。100线程1内核VS 100线程4内核

    如果您有4个内核,那么在本例中运行100个线程不会给您比4个线程更多的加速。现在添加这样一个事实,即启动96个线程的开销对您没有帮助……这可以解释为什么多(100)个线程比单个线程慢

    此外,您的示例可能会生成大量缓存未命中和内存流量。看起来您将读取和写入包含4亿个元素的数组中的每个单元。内存争用将是一个瓶颈

    何时1个线程的运行速度会比多个线程并发运行的速度快

    以下是一些:

  • 如果您正在创建自己的线程:当在每个线程上创建和启动N个线程以及运行M个任务所花费的时间大于在单个线程上运行N*M个任务所花费的时间时。提示:启动Java线程代价高昂

  • 如果您使用的是
    执行器
    ,则计划任务所需的时间对于执行任务来说非常长

  • 提示:多线程(用于绑定计算的任务)所能获得的加速受内核数量而不是线程数量的限制

  • 当任务具有固有的并发瓶颈时,例如访问/更新公共同步数据结构

  • 当任务涉及跨多个线程访问大量内存单元时,会出现大量内存缓存未命中和内存争用

  • 当您在基准测试中出错时