Chinaunix首页 | 论坛 | 博客
  • 博客访问: 113703
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -5
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-08 22:58
文章分类

全部博文(42)

文章存档

2012年(4)

2011年(11)

2010年(20)

2009年(7)

分类: LINUX

2012-01-14 15:32:40

目前正在开发的一个IP camera产品,发现python实现的webgui响应时间过长,2-3秒,决定使用C语言重新实现web页面,其实就是C翻译python,吭d啊~~
熟悉的人知道,cgi其实就是把html文本printf出去,因此大量使用字符copy,sprintf函数使用非常广泛,但如果只是纯字符copy,使用sprintf还是strcpy呢?由于sprintf的返回值为此次copy的字符个数,所以,
sprintf = strcpy + strlen,我们先对比sprintf和strcpy,再对比sprintf和(strcpy + strlen)。

硬件平台:ARMv6-compatible processor rev 5 (v6l) 533MHZ + 128MB DDR;
libc源码 : glibc2.1 + LINUX2.6.38

测试代码:
  1. 1 #include <stdio.h>
  2.   2 #include <string.h>
  3.   3
  4.   4 #if 0
  5.   5 static int testbuf(char *dst, char *src) {
  6.   6     int len;
  7.   7
  8.   8     len = sprintf(dst, src);
  9.   9
  10.  10     return len;
  11.  11 }
  12.  12 #else
  13.  13 static int testbuf(char *dst, char *src) {
  14.  14     int len;
  15.  15
  16.  16     strcpy(dst, src);
  17.  17     //len = strlen(dst);
  18.  18
  19.  19     return len;
  20.  20 }
  21.  21 #endif
  22.  22
  23.  23 int main()
  24.  24 {
  25.  25      int len, count;
  26.  26      char dst[10242], src[10241];
  27.  27
  28.  28      memset(src, 'a', 10240);
  29.  29      src[10240] = '\0';
  30.  30      len = 0;
  31.  31      count = 10000;
  32.  32
  33.  33
  34.  34      while(count --)
  35.  35      len += testbuf(dst, src);
  36.  36
  37.  37
  38.  38      //printf("dst : %s\n", dst);
  39.  39      //printf("len : %d\n", len);
  40.  40
  41.  41      return len;
  42.  42 }


1.sprintf VS strcpy:
通过line 4的if语句分别编译两个exe,测试如下:
# time ./a.sprintf
real    0m 2.01s
user    0m 1.95s
sys     0m 0.00s
# time ./a.strcpywithoutstrlen
real    0m 0.80s
user    0m 0.69s
sys     0m 0.00s

2.sprintf VS (strcpy + strlen):
把line 17打开,测试如下:
# time ./a.sprintf
real    0m 2.01s
user    0m 1.95s
sys     0m 0.00s
# time ./a.strcpywithtrelen
real    0m 1.70s
user    0m 1.63s
sys     0m 0.01s

可见,如果只是单纯的字符copy,不需要统计copy的字符个数,strcpy效率远远高于sprintf,约2.5倍;
在cgi开发中,绝大部分时间copy纯字符也要调用strlen统计copy字符个数,但即使这样,(strcpy + strlen)也比sprintf效率高,大约15%。

阅读(4167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~