首页 > 编程语言 >C语言计算程序运行的时间长度

C语言计算程序运行的时间长度

时间:2024-09-29 09:22:54浏览次数:8  
标签:prime used 程序运行 int printf PSIZE C语言 time 长度

C语言计算程序运行的时间长度

也就是求一段代码的运行结束后耗时多长时间的问题!!!

求100以内的质数的代码,加上计数和计时功能

  1. clock_t start end 取起始时间和终止时间,计算两者之差,得出代码运行所用时间!!!
  2. cpu_time_used 双精度,保存时间
  3. CLOCKS_PER_SEC 宏,每秒的clock数
  4. clock_t, CLOCKS_PER_SEC 在头文件 time.h 中定义,用到时需要包含进去!!!
  5. 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分之一!!!
  • 效率之高,可见算法的重要性!!!

扩展一下

  1. 如果还要计算更大的质数,一个是选用无符号整型(unsigned int),更大的则是用长整型(long),再大的则是选用无符号长整型(unsigned long)!!!
  2. 当然还可以用__int128,128位的二进制整数,比长整型(64位)长一倍,可以进行加减乘除等运算!!!
  3. 还有方法表示更大的整数吗?答案是:有!
    The GNU Multiple Precision Arithmetic Library
    他能计算的整数的长度可能是初学者想不到的!!!

标签:prime,used,程序运行,int,printf,PSIZE,C语言,time,长度
From: https://blog.csdn.net/gwsong52/article/details/142626890

相关文章

  • 【C语言】字符函数和字符串函数(1)
    文章目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和模拟实现一、字符分类函数  C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,这些......
  • 【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)
    文章目录一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码63.二维数组4.总结三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6一、sizeof和strl......
  • 华为OD机试2024年E卷-转骰子[200分]( Java | Python3 | C++ | C语言 | JsNode | Go )实
    题目描述骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转1次),可以逆时针旋转(......
  • 华为OD机试2024年E卷-矩阵匹配[200分]( Java | Python3 | C++ | C语言 | JsNode | Go )
    题目描述从一个N*M(N≤M)的矩阵中选出N个数,任意两个数字不能在同一行或同一列,求选出来的N个数中第K大的数字的最小值是多少。输入描述输入矩阵要求:1≤K≤N≤M≤150输入格式:NMKN*M矩阵输出描述N*M的矩阵中可以选出M!/N!种组合数组,每个组合......
  • C语言自定义类型:联合体
    目录前言一、联合体1.1联合体类型的声明1.2联合体的特点1.3相同成员的结构体和联合体对比1.4联合体大小的计算1.5联合体的⼀个练习总结前言前面我讲到C语言中的自定义结构——结构体,其实C语言中的自定义结构不只有结构体,还有枚举和联合体,我们今天就来学习一下......
  • C语言-文件操作这一篇足够
    目录 1.文件是什么2.文件类型 2.1 程序文件 2.2 数据文件  2.3文件名3.文件的打开与关闭 3.1文件指针3.2文件的打开与关闭 3.2.1fopen和fclose 4.文件的顺序读写 4.1fgetc和fputc4.2fgets和fputs 4.3fscanf和fprintf4.4fread和fwrite 5.......
  • C语言-动态内存管理(malloc、calloc、realloc)
    目录1.内存布局2.动态内存函数2.1malloc2.1.1malloc是什么2.1.2如何用​编辑2.2free2.2.1free是什么2.2.2如何用2.3calloc2.3.1calloc是什么2.4realloc2.4.1realloc是什么2.4.2realloc如何使用2.4.3realloc可以实现与malloc同样的功能3.常见的动态......
  • C语言指针plus版
            本篇文章,我们将一起探讨指针高级版一、指针数组、数组指针    1.1指针数组    就是存放指针的数组,因此指针数组是一个数组,不是指针    例如:   int*pa[5];   //整型指针的数组   char*pb[2];  //字符型指针......
  • 算法训练营第二天| 209.长度最小的子数组、59.螺旋矩阵II
    209.长度最小的子数组状态:没写出来->确认自己的想法是对的之后写出来了!!!初始思路:因为子数组是连续的,所以可以采用滑动窗口,我把这个窗口设置为左闭右闭,所以初始左右边界为0。之后先移动右指针,使得找到第一个和大于等于target的子数组,记录其长度,之后再移动左指针一位,再找第二个......
  • C语言语句
    C语言语句C语言中的的代码是由一条条语句构成,而基本语句分为:•空语句•表达式语句•函数调⽤语句•复合语句•控制语句空语句简而言之,无语句,一个分号为一条语句#include<stdio.h>//主函数intmain(){ ;//空语句 return0;}表达式语句表达式语句......