目前正在开发的一个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 #include <stdio.h>
-
2 #include <string.h>
-
3
-
4 #if 0
-
5 static int testbuf(char *dst, char *src) {
-
6 int len;
-
7
-
8 len = sprintf(dst, src);
-
9
-
10 return len;
-
11 }
-
12 #else
-
13 static int testbuf(char *dst, char *src) {
-
14 int len;
-
15
-
16 strcpy(dst, src);
-
17 //len = strlen(dst);
-
18
-
19 return len;
-
20 }
-
21 #endif
-
22
-
23 int main()
-
24 {
-
25 int len, count;
-
26 char dst[10242], src[10241];
-
27
-
28 memset(src, 'a', 10240);
-
29 src[10240] = '\0';
-
30 len = 0;
-
31 count = 10000;
-
32
-
33
-
34 while(count --)
-
35 len += testbuf(dst, src);
-
36
-
37
-
38 //printf("dst : %s\n", dst);
-
39 //printf("len : %d\n", len);
-
40
-
41 return len;
-
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%。
阅读(4227) | 评论(0) | 转发(0) |