多线程 or 多进程 (实验1)
转自 http://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1
- Real is wall clock time - time from start to finish of the call. This is all elapsed time including time slices used by other processes and time the process spends blocked (for example if it is waiting for I/O to complete).
- User is the amount of CPU time spent in user-mode code (outside the kernel) within the process. This is only actual CPU time used in executing the process. Other processes and time the process spends blocked do not count towards this figure.
- Sys is the amount of CPU time spent in the kernel within the process. This means executing CPU time spent in system calls within the kernel, as opposed to library code, which is still running in user-space. Like 'user', this is only CPU time used by the process. See below for a brief description of kernel mode (also known as 'supervisor' mode) and the system call mechanism.
User+Sys will tell you how much actual CPU time your process used.
转自 http://guishan.org/use-time-command-to-get-linux-command-execution-time-and-stopwatch/
需要注意的是,real并不等于user+sys的总和。real代表的是程序从开始到结束的全部时间,即使程序不占CPU也统计时间。而user+sys是程序占用CPU的总时间,因此real总是大于或者等于user+sys的。
time这个命令可以用来统计一个程序的执行时间,并且能详细到用户态执行时间和内核态执行时间。
实验环境:http://www.cnblogs.com/eavn/archive/2010/09/08/1821774.html
实验数据:
255\100 | 255\300 | 255\500 | 255\800 | ||||
thread | process | thread | process | thread | process | thread | process |
real0m0.784s | real0m0.782s | real0m2.653s | real0m2.537s | real0m4.397s | real0m4.609s | real0m6.795s | real0m6.770s |
user0m0.004s | user0m0.024s | user0m0.000s | user0m0.072s | user0m0.000s | user0m0.144s | user0m0.000s | user0m0.196s |
sys0m0.008s | sys0m0.140s | sys0m0.012s | sys0m0.204s | sys0m0.012s | sys0m0.472s | sys0m0.000s | sys0m0.484s |
real0m0.780s | real0m0.775s | real0m2.516s | real0m2.491s | real0m4.252s | real0m4.311s | real0m6.921s | real0m6.993s |
user0m0.000s | user0m0.032s | user0m0.004s | user0m0.068s | user0m0.004s | user0m0.128s | user0m0.000s | user0m0.180s |
sys0m0.008s | sys0m0.116s | sys0m0.004s | sys0m0.232s | sys0m0.008s | sys0m0.408s | sys0m0.008s | sys0m0.536s |
real0m0.784s | real0m0.784s | real0m2.526s | real0m2.505s | real0m4.269s | real0m4.356s | real0m7.159s | real0m6.862s |
user0m0.000s | user0m0.036s | user0m0.000s | user0m0.048s | user0m0.000s | user0m0.148s | user0m0.004s | user0m0.180s |
sys0m0.012s | sys0m0.120s | sys0m0.004s | sys0m0.228s | sys0m0.012s | sys0m0.376s | sys0m0.004s | sys0m0.464s |
real0m0.757s | real0m0.783s | real0m2.495s | real0m2.504s | real0m4.253s | real0m4.253s | real0m6.895s | real0m6.906s |
user0m0.000s | user0m0.028s | user0m0.004s | user0m0.068s | user0m0.000s | user0m0.136s | user0m0.004s | user0m0.168s |
sys0m0.012s | sys0m0.132s | sys0m0.012s | sys0m0.224s | sys0m0.012s | sys0m0.428s | sys0m0.008s | sys0m0.548s |
real0m0.793s | real0m0.792s | real0m2.495s | real0m2.579s | real0m4.182s | real0m4.246s | real0m6.939s | real0m6.964s |
user0m0.000s | user0m0.036s | user0m0.004s | user0m0.108s | user0m0.004s | user0m0.160s | user0m0.000s | user0m0.208s |
sys0m0.020s | sys0m0.112s | sys0m0.012s | sys0m0.224s | sys0m0.004s | sys0m0.408s | sys0m0.004s | sys0m0.536s |
real0m0.780s | real0m0.793s | real0m2.539s | real0m2.532s | real0m4.321s | real0m4.223s | real0m6.844s | real0m6.940s |
user0m0.004s | user0m0.052s | user0m0.000s | user0m0.052s | user0m0.000s | user0m0.140s | user0m0.000s | user0m0.180s |
sys0m0.004s | sys0m0.144s | sys0m0.008s | sys0m0.256s | sys0m0.004s | sys0m0.392s | sys0m0.008s | sys0m0.464s |
real0m0.807s | real0m0.777s | real0m2.517s | real0m2.484s | real0m4.182s | real0m4.209s | real0m7.196s | real0m6.932s |
user0m0.000s | user0m0.036s | user0m0.004s | user0m0.080s | user0m0.004s | user0m0.128s | user0m0.000s | user0m0.172s |
sys0m0.008s | sys0m0.112s | sys0m0.004s | sys0m0.196s | sys0m0.004s | sys0m0.372s | sys0m0.004s | sys0m0.512s |
real0m0.788s | real0m0.797s | real0m2.484s | real0m2.485s | real0m4.241s | real0m5.371s | real0m6.804s | real0m6.961s |
user0m0.000s | user0m0.024s | user0m0.000s | user0m0.092s | user0m0.000s | user0m0.140s | user0m0.000s | user0m0.208s |
sys0m0.012s | sys0m0.136s | sys0m0.004s | sys0m0.260s | sys0m0.008s | sys0m0.400s | sys0m0.012s | sys0m0.480s |
784.833333 | 785.166667 | 2514.333333 | 2508.5 | 4252.5 | 4332.333333 | 6926.666667 | 6927.333333 |
0.666667 | 31.5 | 2 | 71.5 | 1.333333 | 139 | 0.666667 | 185.166667 |
10 | 125.833333 | 7.333333 | 227.833333 | 8 | 401.5 | 6 | 501.666667 |
255\1000 | 255\5000 | 255\5000 | |||
thread | process | thread | process | thread | process |
real0m8.496s | real0m8.961s | real0m50.289s | real0m51.965s | real1m30.752s | real1m31.121s |
user0m0.008s | user0m0.240s | user0m1.704s | user0m1.408s | user0m2.052s | user0m2.568s |
sys0m0.008s | sys0m0.804s | sys0m2.936s | sys0m3.392s | sys0m8.477s | sys0m6.216s |
real0m8.460s | real0m8.578s | real0m44.868s | real0m44.689s | real1m30.542s | real1m30.769s |
user0m0.000s | user0m0.336s | user0m1.636s | user0m1.316s | user0m2.132s | user0m2.532s |
sys0m0.012s | sys0m0.664s | sys0m3.104s | sys0m3.232s | sys0m8.581s | sys0m6.344s |
real0m8.493s | real0m8.450s | real0m44.490s | real0m45.209s | real1m30.483s | real1m31.582s |
user0m0.004s | user0m0.304s | user0m0.992s | user0m1.412s | user0m2.000s | user0m2.420s |
sys0m0.012s | sys0m0.740s | sys0m2.060s | sys0m3.600s | sys0m8.097s | sys0m6.112s |
real0m8.442s | real0m8.420s | real0m43.916s | real0m48.919s | real1m31.136s | real1m30.916s |
user0m0.004s | user0m0.268s | user0m1.200s | user0m1.332s | user0m2.460s | user0m2.520s |
sys0m0.008s | sys0m0.724s | sys0m2.408s | sys0m3.512s | sys0m8.073s | sys0m6.532s |
real0m8.575s | real0m8.450s | real0m45.639s | real0m47.608s | real1m30.305s | real1m31.100s |
user0m0.000s | user0m0.268s | user0m1.232s | user0m1.384s | user0m1.500s | user0m2.460s |
sys0m0.008s | sys0m0.740s | sys0m2.156s | sys0m3.468s | sys0m6.564s | sys0m6.256s |
real0m8.533s | real0m8.469s | real0m43.383s | real0m46.837s | real1m13.056s | real1m31.788s |
user0m0.000s | user0m0.292s | user0m1.572s | user0m1.284s | user0m1.620s | user0m2.648s |
sys0m0.012s | sys0m0.740s | sys0m2.952s | sys0m3.464s | sys0m6.076s | sys0m6.516s |
real0m8.430s | real0m8.427s | real0m42.469s | real0m55.889s | real1m18.466s | real1m31.126s |
user0m0.004s | user0m0.272s | user0m1.544s | user0m1.324s | user0m1.228s | user0m2.320s |
sys0m0.008s | sys0m0.756s | sys0m2.944s | sys0m3.448s | sys0m5.712s | sys0m5.596s |
real0m8.642s | real0m8.461s | real0m44.512s | real1m0.179s | real1m18.096s | real1m30.226s |
user0m0.004s | user0m0.228s | user0m1.644s | user0m1.224s | user0m1.416s | user0m2.272s |
sys0m0.008s | sys0m0.780s | sys0m3.140s | sys0m3.580s | sys0m5.812s | sys0m5.752s |
8499.5 | 8471.666667 | 44467.833333 | 49404.166667 | 86440.333333 | 91102 |
2.666667 | 273.5 | 1470.666667 | 1341 | 1786.5 | 2469.5 |
9.333333 | 746 | 2749.333333 | 3476.666667 | 7182.833333 | 6199.166667 |
thread | process | |
255\100 | 784.833333 | 785.166667 |
0.666667 | 31.5 | |
10 | 125.833333 | |
255\300 | 2514.333333 | 2508.5 |
2 | 71.5 | |
7.333333 | 227.833333 | |
255\500 | 4252.5 | 4332.333333 |
1.333333 | 139 | |
8 | 401.5 | |
255\800 | 6926.666667 | 6927.333333 |
0.666667 | 185.166667 | |
6 | 501.666667 | |
255\1000 | 8499.5 | 8471.666667 |
2.666667 | 273.5 | |
9.333333 | 746 | |
255\5000 | 44467.833333 | 49404.166667 |
1470.666667 | 1341 | |
2749.333333 | 3476.666667 | |
255\5000 | 86440.333333 | 91102 |
1786.5 | 2469.5 | |
7182.833333 | 6199.166667 |
上述实验数据第一行为P_NUMBER\COUNT的值,每组实验做8次,然后去掉最高值、最低值,再取平均值,为最后三行
从平均值可看出real数据相差不大,相差较大的是user和sys,而根据前文描述用户关心的为real,因此相差不是很大,对linux系统的线程进程实现了解不是很深入,因此对其中的原因不是很清楚,望大牛给予指点
实验中最好是一个实验一个实验慢慢跑,如果是几个实验一起跑可能会有重大偏差
对于给的试验结果不太符合:任务量较大时,多进程比多线程效率高;而完成的任务量较小时,多线程比多进程要快,重复打印 600 次时,多进程与多线程所耗费的时间相同
而且可以说我的结论恰恰相反:任务量较小时,多进程效率较好,任务量较小时,多线程效率较好,这个分界点暂时没法确定
这个原因可能是因为系统不一样;我的求平均值假设不对;。。。
附件求平均值程序
输入data
real 0m6.770s
user 0m0.196s
sys 0m0.484s
real 0m6.993s
user 0m0.180s
sys 0m0.536s
real 0m6.862s
user 0m0.180s
sys 0m0.464s
real 0m6.906s
user 0m0.168s
sys 0m0.548s
real 0m6.964s
user 0m0.208s
sys 0m0.536s
real 0m6.940s
user 0m0.180s
sys 0m0.464s
real 0m6.932s
user 0m0.172s
sys 0m0.512s
real 0m6.961s
user 0m0.208s
sys 0m0.480s
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSZSIZE 32
#define MAXNUM 64
static int cmp(const void *p1, const void *p2)
{
return *((long*)p1) > *((long*)p2);
}
int main()
{
char sz_input[MAXSZSIZE];
char sz_filename[MAXSZSIZE]="data";
long l_real[MAXNUM],l_user[MAXNUM],l_sys[MAXNUM];
long *lp=NULL;
long long_min=0;
double df_second=0;
long l_real_total=0,l_user_total=0,l_sys_total=0;
double df_real_avg=0,df_user_avg=0,df_sys_avg=0;
FILE *f_handle=NULL;
int int_flag=0,int_index=0;
memset (l_real, 0 ,sizeof(l_real));
memset (l_user, 0 ,sizeof(l_user));
memset (l_sys, 0 ,sizeof(l_sys));
f_handle=fopen (sz_filename,"r");
if (f_handle==NULL)
{
perror("can not open file:");
return (1);
}
while (fscanf (f_handle,"%s",sz_input) !=EOF )
{
if (strcmp(sz_input,"real")==0)
{
lp = l_real;
}
else if (strcmp(sz_input,"user")==0)
{
lp = l_user;
}
else if (strcmp(sz_input,"sys")==0)
{
lp = l_sys;
}
else
{
continue;
}
fscanf (f_handle,"%ld%c%lf%c",&long_min,&sz_input[0],&df_second,&sz_input[1]);
//printf ("%ld %c %f %c\n", long_min, sz_input[0], df_second, sz_input[1]);
//exit (1);
*lp = (*lp) + 1;
*(lp+*lp) = (long) ((long_min*60+df_second)*1000);
}
for (int_index=1; int_index<=l_real[0]; int_index++)
printf ("%ld\t%ld\t%ld\n",l_real[int_index],l_user[int_index],l_sys[int_index]);
puts("\n");
qsort(l_real+1,*l_real,sizeof(long),cmp);
qsort(l_user+1,*l_user,sizeof(long),cmp);
qsort(l_sys+1,*l_sys,sizeof(long),cmp);
for (int_index=1; int_index<=l_real[0]; int_index++)
printf ("%ld\t%ld\t%ld\n",l_real[int_index],l_user[int_index],l_sys[int_index]);
puts("\n");
l_real_total = 0;
l_user_total = 0;
l_sys_total = 0;
for (int_index=2; int_index<l_real[0]; int_index++)
{
l_real_total += l_real[int_index];
l_user_total += l_user[int_index];
l_sys_total += l_sys[int_index];
}
df_real_avg = l_real_total*1.0 / (l_real[0]-2);
df_user_avg = l_user_total*1.0 / (l_user[0]-2);
df_sys_avg = l_sys_total*1.0 / (l_sys[0]-2);
printf ("%lf\n%lf\n%lf\n", df_real_avg,df_user_avg,df_sys_avg);
return 0;
}