首先,说明一下python的多线程使用的用户级线程,所以这里使用python多线程作为用户级多线程的代表;c++标准库thread使用的是系统级多线程,所以用c++多线程作为系统级多线程的代表。
关于用户级线程和系统级线程的具体区别,本文不作深究。仅仅从程序运行效率的角度,向大家阐述两者的优劣。
这里python和c++ ,我都构造了一个calc函数作为每个线程的运行程序,并将其与串行运行时间进行比较。每个程序中都构造了64个线程以及串行运行64次calc函数进行时间比较。
calc函数为进行100万次浮点运算。
用户级线程
import time
import threading
def calc():
x=1.5
for i in range(1000000):
if i&1:
x*=2.6
else:
x/=2.6
tlist=[]
for i in range(64):
tlist.append(threading.Thread(target=calc))
begin=time.clock()
for i in range(64):
tlist[i].start()
for i in range(64):
tlist[i].join()
end1=time.clock()
for i in range(64):
calc()
end2=time.clock()
print(end2-end1,end1-begin)
系统级线程
#include<iostream>
#include<thread>
#include<ctime>
using namespace std;
void calc()
{
int i=1000000;
double x=1.5;
while(--i)
{
if(i&1)
{
x*=2.6;
}
else
{
x/=2.6;
}
}
}
int main()
{
thread t[64];
int begin=clock();
for(int i=0;i<64;i++)
{
t[i]=thread(calc);
}
for(int i=0;i<64;i++)
{
t[i].join();
}
int end1=clock();
for(int i=0;i<64;i++)
{
calc();
}
int end2=clock();
cout<<end2-end1<<' '<<end1-begin<<endl;
return 0;
}
结果
用户级线程:
- 多线程:5.989s
- 串行:5.980s
系统级线程:
- 多线程:101ms
- 串行:386ms
PS:博主的cpu是四核的,所以系统级线程最快时间也不会低于串行的1/4。
从上可看出,计算密集型的程序对于用户级线程反而运行时间会增多,因为线程之间需要切换时间。同样,对于单核cpu用户级线程一样也存在这个问题。
而对于多核CPU,想要充分利用cpu资源,可以使用系统级线程,可大大提高运行效率。