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

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
    他能计算的整数的长度可能是初学者想不到的!!!
### 回答1: 在 C 语言中,要计算字符串的长度,可以使用库函数 `strlen()`。该函数的原型如下: ``` size_t strlen(const char *str); ``` 其中,`str` 指向要求长度的字符串。函数返回值为 `size_t` 类型,表示字符串的长度,单位为字符。 举个例子,如果要计算字符串 "Hello, world!" 的长度,可以这样写: ``` #include <stdio.h> #include <string.h> int main() { char str[] = "Hello, world!"; printf("字符串的长度为 %zu 个字符\n", strlen(str)); return 0; } ``` 输出结果为: ``` 字符串的长度为 13 个字符 ``` 注意,`strlen()` 函数不包括字符串的结尾符 `'\0'` 在内。 ### 回答2: 在C语言中,计算字符串的长度是非常常见的操作。C语言中的字符串是一串字符的数组,以Null字符 '\0' 结尾。 要计算字符串的长度,一种常用的方法是遍历字符串中的每个字符,直到遇到 Null 字符为止。下面是一个简单的示例代码: ``` #include <stdio.h> int main() { char str[] = "Hello, World!"; int len = 0; // 遍历字符串,直到遇到 Null 字符 while (str[len] != '\0') { len++; } printf("字符串的长度为: %d\n", len); return 0; } ``` 在上面的代码中,我们初始化了一个字符串 `str`,然后使用 `while` 循环遍历字符串,每次循环检查当前字符是否为 Null 字符,如果不是,则增加长度计数器 `len` 的值。最后,我们打印输出字符串的长度。 对于上述示例代码中的字符串 "Hello, World!",输出将是:字符串的长度为: 13。 以上就是使用C语言计算字符串长度的方法。 ### 回答3: C语言中,我们可以通过使用库函数strlen()来计算字符串的长度。strlen()函数的原型定义在<string.h>头文件中,它接受一个字符串作为参数,并返回该字符串的长度。 下面是一个例子,展示了如何使用strlen()函数计算字符串长度: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "Hello World!"; int length = strlen(str); printf("字符串的长度是:%d\n", length); return 0; } ``` 在上面的例子中,我们定义了一个字符串变量str,并赋值为"Hello World!"。然后,我们通过调用strlen()函数计算了该字符串的长度,并将结果赋给变量length。最后,我们使用printf()函数打印结果。 当我们运行上面的代码时,控制台将输出:"字符串的长度是:12",表明字符串"Hello World!"的长度为12个字符。 需要注意的是,strlen()函数返回的长度并不包括字符串末尾的空字符'\0'。这意味着,如果一个字符串的长度为n,它实际占用的字符空间将是n+1。 通过使用strlen()函数,我们可以方便地计算字符串的长度,以便在程序中进行相应的处理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值