为什么是多线程慢?

编程入门 行业动态 更新时间:2024-10-13 10:23:04
本文介绍了为什么是多线程慢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

所以我想写一个找到素数的程序。该项目的真正目的是了解多线程。首先我写了一个单线程程序,它在1分钟内找到高达13,633,943。

So I am trying to write a program that finds prime numbers. The real purpose of the project is just to learn about multithreading. First I wrote a single thread program and it finds up to 13,633,943 in 1 minute. My multithreaded version only got to 10,025,627.

这是我的单线程程序代码

Here is my code for the single threaded program

#include <iostream> using namespace std; bool isprime(long num) { long lim = num/2; if(num == 1) { return 0; } for(long i = 2; i <= lim; i++) { if (num % i == 0) { return 0; } else{ lim = num/i; } } return 1; } int main() { long lim; cout << "How many numbers should I test: "; cin >> lim; for(long i = 1; i <= lim || lim == 0; i++) { if(isprime(i)) { cout << i << endl; } } }

多线程程序。

extern"C" { #include <pthread.h> #include <unistd.h> } #include <iostream> using namespace std; bool isprime(long num); void * iter1(void * arg); void * iter2(void * arg); void * iter3(void * arg); void * iter4(void * arg); int main() { //long lim; //cout << "How many numbers should I test: "; //cin >> lim; pthread_t t1; char mem1[4096];//To avoid false sharing. Needed anywhere else? pthread_t t2; char mem2[4096];//These helped but did not solve problem. pthread_t t3; pthread_create(&t1, NULL, iter1, NULL); pthread_create(&t2, NULL, iter2, NULL); pthread_create(&t3, NULL, iter3, NULL); iter4(0); } bool isprime(long num) { long lim = num/2; if(num == 1) { return 0; } for(long i = 2; i <= lim; i++) { if (num % i == 0) { return 0; } else{ lim = num/i; } } return 1; } void * iter1(void * arg) { for(long i = 1;; i = i + 4) { if(isprime(i)) { cout << i << endl; } } return 0; } void * iter2(void * arg) { for(long i = 2;; i = i + 4) { if(isprime(i)) { cout << i << endl; } } return 0; } void * iter3(void * arg) { for(long i = 3;; i = i + 4) { if(isprime(i)) { cout << i << endl; } } return 0; } void * iter4(void * arg) { for(long i = 4;; i = i + 4) { if(isprime(i)) { cout << i << endl; } } return 0; }

令我特别困惑的是,系统监视器报告25%的CPU使用率单线程和多线程的100%使用。

Something that especially confuses me is that system monitor reports 25% CPU usage for the single thread and 100% usage for the multithread. Shouldn't that mean it is doing 4 times as many calculation?

推荐答案

我相当肯定 cout 充当共享资源 - 即使它实际上按正确的顺序正确打印每个数字,它也会减慢很多事情。

I'm fairly sure cout acts a shared resource - and even if it actually prints each number correctly and in the right order, it slows things down VERY much to do so.

我做了类似的事情(它更灵活,并使用原子操作来选择下一个数字),它在我的四核机器上几乎快了4倍。但是,只有当我不打印任何东西。如果它打印到控制台,这是一个很慢 - 因为很多时间是使用shuffling像素而不是实际计算。

I have done something similar (it is more flexible, and uses an atomic operation to "pick the next number"), and it's almost exactly 4x faster on my quad core machine. But that's only if I don't print anything. If it prints to the console, it's a lot slower - because a lot of the time is used shuffling pixels rather than actually calculating.

注释 cout< i<< endl; 行,它会运行得更快。

Comment out the cout << i << endl; line, and it will run much quicker.

编辑:使用我的测试程序,打印:

using my test program, with printing:

Single thread: 15.04s. Four threads: 11.25s

不打印:

Single threads: 12.63s. Four threads: 3.69s.

3.69 * 4 = 14.76秒,但时间命令在我的Linux机器上显示12.792秒的总运行时间,所以显然有一点时间,当所有线程都不运行 - 或一些会计错误...

3.69 * 4 = 14.76s, but the time command on my Linux machine shows 12.792s total runtime, so there is obviously a little bit of time when all threads aren't running - or some accounting errors...

更多推荐

为什么是多线程慢?

本文发布于:2023-11-23 12:58:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1621531.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多线程   为什么是

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!