国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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()更高效。

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

圖片精選

主站蜘蛛池模板: 常山县| 吉林省| 道孚县| 呼伦贝尔市| 天津市| 平昌县| 大邑县| 洪江市| 黑龙江省| 济南市| 安徽省| 江口县| 孟津县| 子长县| 额济纳旗| 吉安县| 彩票| 和政县| 尼玛县| 高州市| 封开县| 通辽市| 卢龙县| 嘉荫县| 永定县| 洛南县| 昌吉市| 和平县| 清水县| 新竹县| 合水县| 临颍县| 准格尔旗| 沂源县| 博野县| 高淳县| 四川省| 花莲县| 会昌县| 永兴县| 南宁市|