程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 字符串拷貝函數memcpy和strncpy和snprintf 的機能比擬

字符串拷貝函數memcpy和strncpy和snprintf 的機能比擬

編輯:關於C++

字符串拷貝函數memcpy和strncpy和snprintf 的機能比擬。本站提示廣大學習愛好者:(字符串拷貝函數memcpy和strncpy和snprintf 的機能比擬)文章只能為提供參考,不一定能成為您想要的結果。以下是字符串拷貝函數memcpy和strncpy和snprintf 的機能比擬正文


成績:
函數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()更高效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved