我想检查多线程是否比单线程快,然后我在这里做一个演示:
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));
}
}
首先,我用二和方法运行singleThreadStart,结果是
cpu number:4
499999500000
499999500000
cost time:6719000
然后我运行第二个ThreadStart,结果是
cpu number:4
499999500000
499999500000
cost time:14299000
然后我用五和方法运行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个以上的线程会比使用4个线程慢吗?
如果线程完成得非常快(不是IO绑定和CPU绑定),即使线程数多于CPU内核数,您也可以获得良好的结果。
3.如果我想做某事花费很多时间,最好使用四个线程来做?
您可以使用高级java并发类(newWorkStealingPool
,属于执行器)
请参阅以下问题:
Java's Fork/Join vs ExecutorService-何时使用哪个?
一般来说:
多线程可以通过使用更多的CPU功率来提高应用程序的吞吐量。
这取决于很多因素。
线程数
CPU内核
线程创建成本和上下文切换(可能对多线程有效)
- 数据结构
- 数据的可变性(可能对多线程起作用)
- 数据结构的共享访问/并发性(可能不适用于多线程)
- 应用程序类型:CPU绑定或IO绑定
如果您的应用程序
>
更少的CPU绑定,更少的IO绑定(但仍然可以将多线程用于这些应用程序)
没有共享数据
如果不是,性能取决于上述因素,吞吐量在单线程应用程序和多线程应用程序之间会有所不同。
一些好的SE问题:
https://softwareengineering.stackexchange.com/questions/97615/what-can-multiple-threads-do-that-a-single-thread-cannot
多线程总是比单线程产生更好的性能吗?
为什么在Java中单线程比多线程快?
好文章:
thetechsolo.wordpress.com文章
java性能文章
问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间
问题内容: 以下程序与此处描述的程序基本相同。当我使用两个线程(NTHREADS== 2)运行并编译程序时,得到以下运行时间: 当仅使用一个线程(NTHREADS == 1)运行时,即使仅使用一个内核,运行时间也会明显缩短。 我的系统是双核的,我知道random_r是线程安全的,并且我很确定它是非阻塞的。如果在没有random_r的情况下运行同一程序,并且使用余弦和正弦值的计算作为替换,则双线程版
为什么单线程和多线程脚本具有相同的处理时间?多线程实现不是应该少1/#线程数吗?(我知道当您达到最大cpu线程时,回报会递减) 我搞砸了我的实现吗?
本文向大家介绍Python中单线程、多线程和多进程的效率对比实验实例,包括了Python中单线程、多线程和多进程的效率对比实验实例的使用技巧和注意事项,需要的朋友参考一下 python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优
问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发
问题内容: 我想看看使用多线程生产者而不是单线程生产者会有多少时间差异。我在本地计算机上设置了ActiveMQ,编写了生产者类,该类将初始化并在其构造函数中启动JMS连接。我将消息限制设置为3M,将所有消息推送到ActiveMQ大约花费了50秒。我只发送了一个字符串“ hello world” 3M次。 然后,我使用了相同的生产者对象(一个连接但有多个会话),并使用线程大小为8的ExecutorS