多线程比单线程快吗?

2023-11-26

我想检查多线程是否比单线程快,然后我在这里做了一个演示:

public class ThreadSpeedTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("cpu number:"
                + Runtime.getRuntime().availableProcessors());
        singleThreadStart();
//      secondThreadStart();
//      fiveThreadStart();
    }

    private static void sum() {
        long sum = 0;
        for (int i = 0; i < 1000000; i++) {
            sum += i;
        }
        System.out.println(sum);
    }

    private static void singleThreadStart() {
        new Thread(new Runnable() {

            public void run() {
                long start = System.nanoTime();
    //          sum();
    //          sum();
    //          sum();
                sum();
                sum();
                long end = System.nanoTime();
                System.out.println("cost time:" + (end - start));
            }
        }).start();
    }

    private static void secondThreadStart() {
        long start = System.nanoTime();
        Thread thread1 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.nanoTime();
        System.out.println("cost time:" + (end - start));
    }

    private static void fiveThreadStart() {
        long start = System.nanoTime();
        Thread thread1 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread2.start();
        Thread thread3 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread3.start();
        Thread thread4 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread4.start();
        Thread thread5 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread5.start();

        try {
            thread1.join();
            thread2.join();
            thread3.join();
            thread4.join();
            thread5.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.nanoTime();
        System.out.println("cost time:" + (end - start));
    }
}

首先我用两个 sum 方法运行 singleThreadStart ,结果是

cpu number:4
499999500000
499999500000
cost time:6719000

然后我运行 SecondThreadStart,结果是

cpu number:4
499999500000
499999500000
cost time:14299000

然后我用五个 sum 方法运行 singleThreadStart ,结果是

cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:10416000

最后我运行 FiveThreadStart,结果是

cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:15708000

我的问题是:

  1. SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的成本吗?
  2. 尽管创建线程的成本很高,但CPU数量是4,那么使用超过4个线程会比使用四个线程慢吗?
  3. 如果我想做一些需要更多时间的事情,使用四个线程来做是最好的吗?

1.第二个ThreadStart比单个ThreadStart花费更多的时间,是因为创建线程的成本吗?

当然,创建线程会产生开销。

2.cpu数量为4,尽管创建线程的成本很高,所以使用超过4个线程会比使用4个线程慢吗?

如果线程非常快地完成(不受 IO 限制和 CPU 限制),即使线程数量多于 CPU 核心数量,您也可以获得良好的结果。

3.如果我想做一些耗时较长的事情,用四个线程来做最好吗?

您可以使用高级java并发类(newWorkStealingPool of Executors)

参考这个SE问题:

Java Forkjoin 与 ExecutorService - 何时使用哪个?

一般来说:

多线程可以通过使用更多的 CPU 能力来提高应用程序的吞吐量。

这取决于很多因素。

  1. 线程数
  2. CPU核心数
  3. 线程创建成本和上下文切换(可能不利于多线程)
  4. 数据结构
  5. 数据的可变性(可能不利于多线程)
  6. 数据结构的共享访问/并发(可能不适用于多线程)
  7. 应用程序类型:CPU 密集型或 IO 密集型

如果您的应用程序是这样的话,多线程将提供出色的结果

  1. 更少的 CPU 限制,更少的 IO 限制(但多线程仍然可以用于这些应用程序)

  2. 没有共享数据

如果不是,性能取决于上述因素,并且单线程应用程序和多线程应用程序之间的吞吐量会有所不同。

一些很好的 SE 问题:

https://softwareengineering.stackexchange.com/questions/97615/what-c​​an-multiple-threads-do-that-a-single-thread-cannot

多线程总是比单线程产生更好的性能吗?

为什么Java中单线程比多线程快?

好文章:

thetechsolo.wordpress.com article

java 性能 article

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程比单线程快吗? 的相关文章

随机推荐

  • getRight、getLeft、getTop 返回零

    我正在使用以下代码 但所有方法都返回零值 我知道要获取视图的坐标 应该绘制我们的视图 这就是为什么我在 onResume 方法中使用代码但仍然不起作用 任何想法 Override public void onResume super onR
  • 为什么 Integer.MIN_VALUE 的绝对值等于 Integer.MIN_VALUE

    在java中当我说Integer i Math abs Integer MIN VALUE 我得到与答案相同的值 这意味着i包含Integer MIN VALUE 我也在 C 中验证了同样的情况 为什么会有这种行为 阅读 Joshua Bl
  • 无法从 shell 访问集合 - SyntaxError: Missing ;之前的语句(外壳):1

    我编写了一个脚本 使用 mongoimport 将 csv 文件加载到 mongodb 中 当我对两个相似的 csv 文件 同一类型 运行此命令时 两者都可以正常上传 但是我只能从 mongodb shell 访问其中一个 以下是 mong
  • 如何生成变更日志:自上次 Hudson 构建以来的 git 日志?

    我正在使用 Phing 在 Hudson 中执行构建后任务 我想生成包含自上次成功构建 Hudson 以来的所有提交的变更日志 但看起来 Hudson 和 Hudson 的 Git 插件都不提供 last build time 多变的 这将
  • LibGit2 LibGit2Sharp (+SSH) 的 SSH 私钥应采用哪种格式

    我有点陷入 SSH 私钥问题和 LibGit2Sharp Ssh 的困境 我有一个 Net C 应用程序 它使用 LibGit2Sharp Ssh 克隆 Git 存储库 我需要使用 SSH 带有用户 密码的 https 不是一个选项 并且我
  • 文本/javascript 与应用程序/javascript [重复]

    这个问题在这里已经有答案了 我对 MIME 类型的语义很好奇application javascript versus text javascript 除了明显的之外 一个是要执行的 另一个是文本 I see application jav
  • 检查Android设备是否支持4K视频?

    我正在尝试在我的应用程序中播放 4K 视频 但只要所有设备都无法播放 4K 视频 我就会遇到一些麻烦 在播放视频之前 如何在运行时检查该设备是否支持它 首先 您必须记住 4k 只是一个分辨率 但您还必须记住比特率 以下是测试在特定设备上是否
  • 如何在shiny::numericInput 中使标签和框彼此相邻对齐?

    是否有可能创建一个numericInput 对于闪亮的地方 盒子位于标签旁边 而不是默认的标签下方 这是一个简单的例子 library shiny ui lt shinyUI fluidPage titlePanel Shiny with
  • 将文件中每一行的第一个字母更改为大写

    我需要将文件中每一行的第一个字母更改为大写 例如 the bear ate the fish the river was too fast 会成为 The bear ate the fish The river was too fast 该
  • 从 Xsd 构建 UI 的工具包或应用程序

    我需要构建一个用户界面来编辑和创建符合给定 xsd 架构的 xml 文档 我想做的是 尽可能基于该 xsd 架构生成我的用户界面 xsd 模式可以 并且将会 随着时间的推移而改变 因此解决方案需要具有一定的灵活性 用户界面需要是一个 Web
  • Firebase 存储使用 490MB 但我没有存储桶?

    Firebase 存储正在使用 490 MB 但尚未初始化任何存储桶 我无法追踪该存储的来源 但检查 Firebase 对空存储收取 0 10 美元的费用是很奇怪的 我在哪里可以删除此存储以及为什么 firebase 因没有存储桶而收费 目
  • Dijkstra算法:如果有两个或多个权重最小的节点怎么办?

    在 Dijkstra 算法中 如果算法中的某个点有两个或多个权重最小的节点 我该怎么办 在维基百科中 http en wikipedia org wiki Dijkstra 27s algorithm在步骤号 6 它说 将暂定距离最小的未访
  • 使用 pip 安装 TextBlob 时遇到问题

    我在 Windows 10 上使用 pip 在命令行中安装 TextBlob 时遇到了一些困难 根据他们的文档 您需要连续运行两个命令 pip install U textblob python m textblob download co
  • 非轴对齐矩形交集[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在尝试找到一种算法来计算两个矩形 不一定是轴对齐 之间的交集 并返回结果交集 这个问题描述寻找是否存在交叉点 我想要得到交叉点的最终形状 如果存在 我对该算法的应用将使用一个
  • 从“docker ps”获取容器 ID 的 Shell 命令

    我基本上希望实现这两个步骤 1 运行docker镜像 docker run p 80 80 某些图像名称 25 2 现在 docker ps 返回有关容器的完整数据 但我只是在寻找容器 ID 3 对其进行一些测试 例如 docker exe
  • jquery颜色动画间歇性地抛出无效的属性值

    我正在尝试为 ASP Net 超链接的背景设置动画 以在更新面板刷新时进行黄色淡入淡出 到目前为止 它几乎在所有时间都有效 但偶尔会抛出一个 JavaScript 错误 无效的属性值 它调试到jquery颜色插件代码到这一行 fx elem
  • 为 STL 排序算法定义 < - 运算符重载、函子还是独立函数?

    我有一个包含 Widget 类对象的 stl list 它们需要根据 Widget 类中的两个成员进行排序 为了使排序工作 必须定义一个比较两个 Widget 对象的小于比较器 似乎有无数种方法可以做到这一点 据我所知 人们可以 A 在类中
  • 获取内存上的可用空间

    是否可以通过 Android SDK 获取 Android 设备 而不是 SD 卡 上的可用内存量 如果是这样 怎么办 this帖子可能很适合您的问题 还检查这个线程 这里有很多关于SO的信息 谷歌搜索了一下 这是解决方案 位于安卓 git
  • 隐藏超出 DIV 元素的文本

    我有一个固定宽度的 DIV 元素 其中有一些文本 其中没有任何空格供 HTML 解析器自动分成多行 文本超出了 DIV 的限制并弄乱了 pgae 有没有办法让超出边界的文本不可见 是否可以将其分成多行 或者更好地分成多行 并在每条折行的末尾
  • 多线程比单线程快吗?

    我想检查多线程是否比单线程快 然后我在这里做了一个演示 public class ThreadSpeedTest param args public static void main String args System out print