一个并发程序开多少线程合适?
来源:互联网 发布:2017年进出口贸易数据 编辑:程序博客网 时间:2024/04/18 20:54
文章来源:http://blog.csdn.net/greencacti/article/details/5881964
最近在和朋友讨论的过程中,朋友说线程开得多性能好,理由是系统中已经有成百上千的线程,并发程序开的线程越多分配到CPU的概率越高。我不认可该观点,下面来验证。
最好起CPU核心数量*2 个线程
或者 CPU核心数量*2 +2 个线程
测试场景:
硬件:HP G6(8核16流水线)
操作系统:Suse10 SP2
测试程序实现描述:
定义一个long型数组,假设有n个Entry,当有m个线程时,线程1对0~(n/m-1)中元素依次循环累加,线程2对n/m~(2n/m-1)元素依次循环累加...。最后把long型数组所有entry相加,看得到的数(此数就是所有线程对数组操作的次数)
测试结果:
Thread Num Result1 Result2 Result3
2 Threads: 186,793,032,169 186,697,212,695
4 Threads: 373,926,225,686 373,407,260,760
8 Threads: 742,705,309,211 746,706,667,311 744,690,656,181
16 Threads: 794,363,499,559
20 Threads: 794,068,481,342 793,703,559,671 794,294,479,450
测试结论:
1.当Active的线程数等于CPU流水线数时,系统性能最高;
2. 当然实际系统中有IO和网络操作时,很多时候瓶颈可能在IO;
3. 在设计系统时,要考虑到系统Active线程数,因为很多线程可能会进入block状态,不能一定认为线程数等于流水线就是性能最好;
测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define ARRAY_SIZE 1000000
struct range
{
int start;
int end;
};
long array[ARRAY_SIZE];
int threadStopFlag = 0;
void *updateArray(void * ptrRange);
int main(int argc, char* argv[])
{
struct range *rangeArray[100] = {NULL};
pthread_t threadIdArray[100];
int numOfThreads = 0;
int i = 0;
int size = 0;
int error = 0;
long result = 0;
//check the number of parameters
if(2 != argc)
{
printf("usage: a.out threadnumber/n");
return -1;
}
//validate the parameter
numOfThreads = atoi(argv[1]);
if(numOfThreads > 100)
{
printf("The number of threads is greater than 100/n");
return -1;
}
//create the worker thread
size = ARRAY_SIZE / numOfThreads;
for(i=0; i< numOfThreads; i++)
{
//calculate the start and end value
rangeArray[i] = (struct range*)malloc(sizeof(struct range));
if(NULL == rangeArray[i])
{
return -1;
}
rangeArray[i]->start = i * size;
if(i != numOfThreads - 1)
{
rangeArray[i]->end = rangeArray[i]->start + size - 1;
}
else
{
rangeArray[i]->end = ARRAY_SIZE -1;
}
//create the threads
error = pthread_create(&threadIdArray[i], NULL, updateArray, (void *)rangeArray[i]);
if(error != 0)
{
printf("pthread is not created./n");
return -1;
}
}
//kill all the worker threads
sleep(300);
threadStopFlag = 1;
sleep(60);
//free the malloc memory
for(i=0; i < numOfThreads; i++)
{
free(rangeArray[i]);
rangeArray[i] = NULL;
}
//calculate the total number
for(i=0; i<ARRAY_SIZE; i++ )
{
result += array[i];
}
printf("The total number is %ld/n", result);
return 0;
}
void *updateArray(void * ptrRange)
{
struct range *arrayRange;
int pointer = 0;;
int start = 0;;
int end = 0;
arrayRange = (struct range *)ptrRange;
start = arrayRange->start;
end = arrayRange->end;
pointer = start;
while(1)
{
if(pointer > end)
{
pointer = start;
}
array[pointer] += 1;
pointer++;
if(1 == threadStopFlag)
{
pthread_exit(0);
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 一个并发程序开多少线程合适?
- weblogic 设置多少个GC线程合适
- 一个目录下放多少文件合适?
- 一个函数内多少行代码合适
- Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?
- 开多少个FCGI进程才合适
- ES 一个索引多少分片合适?(持续更新)
- 一个函数有多少行代码比较合适?
- strcpy_s :拷贝多少合适?
- 虚拟内存设置多少合适
- 邮件点击率多少合适?
- window里面一个进程理论上能开多少线程?
- 关于,C/S传输数据时,并发的socket数,多少个合适?10
- 并发程序—线程池
- 【Java】线程并发拷贝程序
- 【Linux】线程并发拷贝程序
- 多线程程序启动多少线程比较好
- 一个进程可以创建多少线程?
- 20个JAVA人员非常有用的功能代码
- Linux bash脚本的调用/注释和运行方式
- APP上线流程总结
- iOS编程-------UITableView表视图 / UITableViewCell的重用机制
- [leetcode] Insert sort list
- 一个并发程序开多少线程合适?
- [Python进阶-4]类的继承/多态/多重继承/任意多参数
- 浅谈android的selector,背景选择器
- jdbc数据库连接
- OpenCV 学习(图像的基本运算)
- POJ3573(模拟)
- java学习笔记]java语言基础概述之内存的划分&堆和栈
- POJ3259 Wormholes SPFA 或者 bellman_ford
- 多线程编程的基础知识