亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

字符串拷貝函數memcpy和strncpy以及snprintf 的性能比較

2020-01-26 15:57:59
字體:
來源:轉載
供稿:網友

問題:
函數memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), "%s", src)都可以將src字符串中的內容拷貝到dest字符串中。
哪一種方式效率最高呢?
就是說,哪種方式性能最好呢?
解決辦法:
1. 建立三個文件test_memcpy.c,test_strncpy.c和test_snprintf.c:
文件test_memcpy.c:

復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ cat test_memcpy.c
#include <string.h>
int main(){
 char src[] = "1234567890";
 char dest[2048];
 int len = 0;
 for(int i = 0; i < 10000000; ++i){
  memset(dest, 0, sizeof(dest));
  len = strlen(src);
  len = sizeof(dest) - 1 > len? len: sizeof(dest) -1;
  memcpy(dest, src, len);
  dest[len] = '/0';
 }
 return 0;
}

文件test_strncpy.c:
復制代碼 代碼如下:

#include <string.h>
int main() {
 char src[] = "1234567890";
 char dest[2048];
 int len = 0;

 for(int i = 0; i < 10000000; ++i) {
  memset(dest, 0, sizeof(dest));
  strncpy(dest, src, sizeof(dest));
 }

 return 0;
}

文件test_snprintf.c:
復制代碼 代碼如下:

#include <stdio.h>
#include <string.h>
int main() {
 char src[] = "1234567890";
 char dest[2048];
 int len = 0;

 for(int i = 0; i < 10000000; ++i) {
  memset(dest, 0, sizeof(dest));
  snprintf(dest, sizeof(dest), "%s", src);
 }

 return 0;
}

2. 分別編譯三個文件:
復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_memcpy test_memcpy.c
david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_strncpy test_strncpy.c
david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -o test_snprintf test_snprintf.c

3. 沒有優化的情況下不同函數消耗時間對比:
復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy
real 0m16.472s
user 0m16.309s
sys 0m0.036s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf
real 0m6.106s
user 0m6.100s
sys 0m0.000s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy
real 0m4.179s
user 0m4.144s
sys 0m0.000s
david@u1110-hp:~/wrk/tmp/cstring$

從上面運行結果可以看出:沒有任何優化的情況下,memcpy()和strncpy()性能相差4倍,snprintf()和strncpy()性能相差約2.5倍。

4.采用O3優化情況下不同函數消耗時間對比:

復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_snprintf test_snprintf.c
david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_strncpy test_strncpy.c
david@u1110-hp:~/wrk/tmp/cstring$ gcc -std=c99 -O3 -o test_memcpy test_memcpy.c
david@u1110-hp:~/wrk/tmp/cstring$

復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy
real 0m16.178s
user 0m16.161s
sys 0m0.000s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf
real 0m6.242s
user 0m6.032s
sys 0m0.056s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy
real 0m3.567s
user 0m3.436s
sys 0m0.012s
david@u1110-hp:~/wrk/tmp/cstring$

從上面運行結果可以看出:采用O3優化后,memcpy()和strncpy()性能相差近5倍,snprintf()和strncpy()性能相差基本不變約2.5倍。

5. 性能對比結論:
在需要用到字符串拷貝函數的時候,永遠不要使用strncpy(),無論什么時候都用snprintf()來代替,而memcpy()是性能更好的實現方式。
strlen+memcpy也是linux內核的實現方式。

6. 意外收獲結論:
將上述三個文件中的memset()改為用bzero()來實現數組的清零操作。
使用O3來進行優化,三個函數的耗時時間如下:
復制代碼 代碼如下:

david@u1110-hp:~/wrk/tmp/cstring$ time ./test_strncpy
real 0m14.395s
user 0m13.929s
sys 0m0.092s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_snprintf
real 0m3.785s
user 0m3.772s
sys 0m0.000s
david@u1110-hp:~/wrk/tmp/cstring$ time ./test_memcpy
real 0m1.241s
user 0m1.236s
sys 0m0.004s
david@u1110-hp:~/wrk/tmp/cstring$

結論:僅僅換了一個清零函數,使得memcpy()和strncpy()的性能差別達到約12倍,而snprintf()和strncpy()的性能差別也達到約4倍。
就清零操作來說,bzero()遠比memset()更高效。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品一区二区| 亚洲免费视频网站| 欧美中文字幕视频在线观看| 亚洲欧美一区二区三区情侣bbw| 国产精品视频一区国模私拍| 欧美亚洲日本网站| 欧美午夜精品久久久久久人妖| 亚洲区中文字幕| 91久久嫩草影院一区二区| 亚洲第一在线视频| 中文字幕精品国产| 日韩**中文字幕毛片| 国产a级全部精品| 日韩电影视频免费| 亚洲性视频网址| 亚洲爱爱爱爱爱| 精品久久久久久久中文字幕| 国产伦精品免费视频| 亚洲天堂男人的天堂| 亚洲另类激情图| 久久精品99久久久久久久久| 久久久综合免费视频| 午夜精品久久久久久久男人的天堂| 精品小视频在线| 日韩欧美福利视频| 久久97久久97精品免视看| 日韩欧美亚洲一二三区| 亚洲变态欧美另类捆绑| 欧美专区福利在线| y97精品国产97久久久久久| 亚洲精品久久在线| 成人在线小视频| 亚洲精品久久久久久久久久久久久| 国产在线一区二区三区| 亚洲人成欧美中文字幕| 成人高h视频在线| 久久99亚洲热视| 国产成人精品999| 成人黄色大片在线免费观看| 日韩av综合网站| 日韩中文字幕免费视频| 欧美黑人一级爽快片淫片高清| 国产精品黄色av| 久久久久日韩精品久久久男男| 欧美高清视频在线观看| 中文字幕综合一区| 国语自产精品视频在线看| 亚洲成人av中文字幕| 91国内在线视频| 日本高清+成人网在线观看| 黄色一区二区三区| 亚洲一区国产精品| 亚洲色图17p| 日韩专区中文字幕| 欧美最猛性xxxx| 97激碰免费视频| 91久久综合亚洲鲁鲁五月天| 亚洲自拍另类欧美丝袜| 久久久久久久久爱| 亚洲欧美变态国产另类| 国精产品一区一区三区有限在线| 97视频在线观看免费高清完整版在线观看| 久久久天堂国产精品女人| 亚洲国产古装精品网站| 国产999精品视频| 不卡毛片在线看| 97av视频在线| 成人免费在线视频网址| 91免费版网站入口| 久久中文字幕国产| 精品偷拍一区二区三区在线看| 亚洲女人被黑人巨大进入| 在线精品高清中文字幕| 亚洲最大的免费| 国产精品亚洲欧美导航| 久久精品美女视频网站| 欧美午夜激情在线| 亚洲电影成人av99爱色| 亚洲男人天堂久| 久久资源免费视频| 亚洲综合最新在线| 久久琪琪电影院| 中文字幕日韩有码| 在线日韩精品视频| 日韩在线中文字| 疯狂欧美牲乱大交777| 九九热r在线视频精品| 一本色道久久综合亚洲精品小说| 欧洲精品在线视频| 亚洲视频在线观看免费| 亚洲欧美国产精品专区久久| 国产精品成人播放| 国产美女精彩久久| 日韩精品免费电影| 国产成人精品免费久久久久| 欧美黄色www| 国内精品小视频| 秋霞午夜一区二区| 欧美一区二粉嫩精品国产一线天| 国产精品久久久久久亚洲影视| 九九精品在线播放| 国产一区二区三区视频| 91精品国产网站| 欧美日韩国产页| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲精品suv精品一区二区| 韩国欧美亚洲国产| 成人做爰www免费看视频网站| 亚洲精品电影网站| 久久久久久久999精品视频| 久久久精品日本| 91视频九色网站| 51精品国产黑色丝袜高跟鞋| 午夜精品久久久久久久99黑人| 日韩专区在线播放| 亚洲tv在线观看| 国产精品v日韩精品| 欧美激情图片区| 97精品国产aⅴ7777| 91成人在线观看国产| 亚洲丝袜在线视频| 国产精品伦子伦免费视频| 久久av在线看| 日韩欧美在线免费| 高清在线视频日韩欧美| 国内免费精品永久在线视频| 欧美激情成人在线视频| 日韩av电影在线免费播放| 日韩av在线免费播放| 麻豆国产va免费精品高清在线| 成人精品一区二区三区| 亚洲高清福利视频| 国产一区二区三区四区福利| 91精品视频在线| 国产精品69精品一区二区三区| 精品久久久久久久久久久久| 清纯唯美日韩制服另类| 亚洲第一网站男人都懂| 中文字幕日韩精品在线| 日韩精品在线电影| 国产精品夜色7777狼人| 日韩激情av在线免费观看| 久久精品91久久久久久再现| 精品一区二区三区四区在线| 伦伦影院午夜日韩欧美限制| 精品国产成人在线| 国产日韩精品综合网站| 97视频在线观看免费| 亚洲成人av在线| 亚洲理论在线a中文字幕| 亚洲精品乱码久久久久久按摩观| 91亚洲精品一区二区| 一区二区三区国产在线观看| 亚洲成av人片在线观看香蕉| 久久久国产精品x99av| 国产精品欧美亚洲777777| 国产91精品最新在线播放| 亚洲人成啪啪网站| 国产精品美女网站| 国产欧美精品xxxx另类| 最新国产成人av网站网址麻豆| 96pao国产成视频永久免费| 91九色国产社区在线观看| 亚洲成人xxx|