用户级线程VS系统级线程

首先,说明一下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资源,可以使用系统级线程,可大大提高运行效率。

发布了4 篇原创文章 · 获赞 0 · 访问量 210

猜你喜欢

转载自blog.csdn.net/qq_42378281/article/details/105502245