C语言计算程序运行的时间长度
也就是求一段代码的运行结束后耗时多长时间的问题!!!
求100以内的质数的代码,加上计数和计时功能
- clock_t start end 取起始时间和终止时间,计算两者之差,得出代码运行所用时间!!!
- cpu_time_used 双精度,保存时间
- CLOCKS_PER_SEC 宏,每秒的clock数
- clock_t, CLOCKS_PER_SEC 在头文件 time.h 中定义,用到时需要包含进去!!!
- count 计数变量,初始为0,每发现一个质数自增一次
代码如下:
/* filename: prime.c */
#include <stdio.h>
#include <stdlib.h> //for malloc and free
#include <string.h> //for memset
#include <time.h> //for clock
/* compile : gcc prime.c -o prime
run : ./prime */
#define PSIZE 100
/**/
void
get_prime (void)
{
int count = 0;
char *prime = (char*) malloc (PSIZE);
memset (prime, 0, PSIZE);
prime[0] = 1; prime[1] = 1;
for (int i = 2; i*2 < PSIZE; i++)
prime[i*2] = 1;
for (int i = 3; i < PSIZE/3+1; i = i + 2)
for (int j = 2; i*j < PSIZE; j++)
prime[i*j] = 1;
for (int i = 0; i < PSIZE; i++)
if (0 == prime[i])
{
count++;
printf ("%d ", i);
}
printf ("\nCount : %d\n", count);
free (prime);
}
/**/
int
main (int argc, char *argv[])
{
clock_t start, end;
double cpu_time_used;
printf ("Prime 0 - %d :\n", PSIZE);
start = clock();
get_prime (); //需要计时的代码
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Cpu time used = %f\n", cpu_time_used);
return 0;
}
/* --(:-O-:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/zoo$ gcc prime.c -o prime
songvm@ubuntu:~/works/xdn/zoo$ ./prime
Prime 0 - 100 :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Count : 25
Cpu time used = 0.000013
计算1到10000000(一千万)之间的质数数量
- 以上的代码运行耗时0.000013秒,非常快了!!!
- 将宏PSIZE的值由100改为10000000!
- 输出统计总数,不再输出质数本身!!!
代码如下:
/* filename: prime.c */
#include <stdio.h>
#include <stdlib.h> //for malloc and free
#include <string.h> //for memset
#include <time.h> //for clock
/* compile : gcc prime.c -o prime
run : ./prime */
#define PSIZE 10000000
/**/
void
get_prime (void)
{
int count = 0;
char *prime = (char*) malloc (PSIZE);
memset (prime, 0, PSIZE);
prime[0] = 1; prime[1] = 1;
for (int i = 2; i*2 < PSIZE; i++)
prime[i*2] = 1;
for (int i = 3; i < PSIZE/3+1; i = i + 2)
for (int j = 2; i*j < PSIZE; j++)
prime[i*j] = 1;
for (int i = 0; i < PSIZE; i++)
if (0 == prime[i])
{
count++;
//printf ("%d ", i);
}
printf ("\nCount : %d\n", count);
free (prime);
}
/**/
int
main (int argc, char *argv[])
{
clock_t start, end;
double cpu_time_used;
printf ("Prime 0 - %d :\n", PSIZE);
start = clock();
get_prime (); //需要计时的代码
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Cpu time used = %f\n", cpu_time_used);
return 0;
}
/* --(:-O-:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/zoo$ gcc prime.c -o prime
songvm@ubuntu:~/works/xdn/zoo$ ./prime
Prime 0 - 10000000 :
Count : 664579
Cpu time used = 0.697980
- 只用了不到0.7秒的时间!!!
- 注意:不同的系统,不同的硬件平台,得到的用时结果都可能是不一样的!!!
- 注意:多次运行的用时结果也可能是不一样的,因为系统会有缓存!!!
- 本人机器老旧,虚拟了一个CPU两个核的Ubuntu Desktop 18.04 LTS !!!
输出1到100000000(1亿)的质数统计表,看一下用时多少秒
代码如下:
/* filename: prime.c */
#include <stdio.h>
#include <stdlib.h> //for malloc and free
#include <string.h> //for memset
#include <time.h> //for clock
/* compile : gcc prime.c -o prime
run : ./prime */
#define PSIZE 100000000
/**/
void
get_prime (void)
{
int count = 0;
char *prime = (char*) malloc (PSIZE);
memset (prime, 0, PSIZE);
prime[0] = 1; prime[1] = 1;
for (int i = 2; i*2 < PSIZE; i++)
prime[i*2] = 1;
for (int i = 3; i < PSIZE / 3 + 1; i = i + 2)
for (int j = 2; i*j < PSIZE; j++)
prime[i*j] = 1;
for (int i = 0; i < PSIZE; i++)
{
if (0 == prime[i]) count++;
if (i == 100)
printf ("1 - 100 : %d\n", count);
else if (i == 1000)
printf ("1 - 1000 : %d\n", count);
else if (i == 10000)
printf ("1 - 10000 : %d\n", count);
else if (i == 100000)
printf ("1 - 100000 : %d\n", count);
else if (i == 1000000)
printf ("1 - 1000000 : %d\n", count);
else if (i == 10000000)
printf ("1 - 10000000 : %d\n", count);
}
printf ("1 - %u : %d\n", PSIZE, count);
free (prime);
}
/**/
int
main (int argc, char *argv[])
{
clock_t start, end;
double cpu_time_used;
printf ("Prime 0 - %d :\n", PSIZE);
start = clock();
get_prime (); //需要计时的代码
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Cpu time used = %f\n", cpu_time_used);
return 0;
}
/* --(:-O-:)-- */
编译运行,结果如下:
Prime 0 - 100000000 :
1 - 100 : 25
1 - 1000 : 168
1 - 10000 : 1229
1 - 100000 : 9592
1 - 1000000 : 78498
1 - 10000000 : 664579
1 - 100000000 : 5761455
Cpu time used = 25.891674
再算1到10亿之间的质数的数量
- 上一个运行耗时不到26秒,可以接受!!!
- 改一下代码,再算1到10亿这间的质数的数量
代码如下:
/* filename: prime.c */
#include <stdio.h>
#include <stdlib.h> //for malloc and free
#include <string.h> //for memset
#include <time.h> //for clock
/* compile : gcc prime.c -o prime
run : ./prime */
/**/
typedef unsigned long ulong;
/**/
#define PSIZE 1000000000
/**/
void
get_prime (void)
{
int count = 0;
char *prime = (char*) malloc (PSIZE);
memset (prime, 0, PSIZE);
prime[0] = 1; prime[1] = 1;
for (ulong i = 2; i*2 < PSIZE; i++)
prime[i*2] = 1;
for (ulong i = 3; i < PSIZE/3+1; i = i + 2)
for (ulong j = 3; i*j < PSIZE; j++)
prime[i*j] = 1;
for (ulong i = 0; i < PSIZE; i++)
if (0 == prime[i])
count++;
printf ("\nCount : %d\n", count);
free (prime);
}
/**/
int
main (int argc, char *argv[])
{
clock_t start, end;
double cpu_time_used;
printf ("Prime 0 - %d :\n", PSIZE);
start = clock();
get_prime (); //需要计时的代码
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Cpu time used = %f\n", cpu_time_used);
return 0;
}
/* --(:-O-:)-- */
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/zoo$ ./prime
Prime 0 - 1000000000 :
Count : 50847534
Cpu time used = 198.287914
songvm@ubuntu:~/works/xdn/zoo$
- 结果是50847534,与上次的结果相同!!!
- 用时198.287914秒,3分多钟,耗时是上次90分钟的30分之一!!!
- 效率之高,可见算法的重要性!!!
扩展一下
- 如果还要计算更大的质数,一个是选用无符号整型(unsigned int),更大的则是用长整型(long),再大的则是选用无符号长整型(unsigned long)!!!
- 当然还可以用__int128,128位的二进制整数,比长整型(64位)长一倍,可以进行加减乘除等运算!!!
- 还有方法表示更大的整数吗?答案是:有!
The GNU Multiple Precision Arithmetic Library
他能计算的整数的长度可能是初学者想不到的!!!