最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年07月25日 09:17:45   作者:  
以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進行了比較,需要的朋友可以過來參考下

問題:
函數(shù)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. 沒有優(yōu)化的情況下不同函數(shù)消耗時間對比:
復制代碼 代碼如下:

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$

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

4.采用O3優(yōu)化情況下不同函數(shù)消耗時間對比:

復制代碼 代碼如下:

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優(yōu)化后,memcpy()和strncpy()性能相差近5倍,snprintf()和strncpy()性能相差基本不變約2.5倍。

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

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

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$

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

相關文章

  • Qt5.9畫五角星的方法

    Qt5.9畫五角星的方法

    這篇文章主要為大家詳細介紹了Qt5.9畫五角星的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法

    C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法

    OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法

    這篇文章主要為大家詳細介紹了OpenGL實現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++ 面試題翻譯電話號碼實例代碼

    C++ 面試題翻譯電話號碼實例代碼

    這篇文章主要介紹了C++ 面試題翻譯電話號碼實例代碼的相關資料,需要的朋友可以參考下
    2017-04-04
  • C++中allocator類使用示例

    C++中allocator類使用示例

    大家好,本篇文章主要講的是C++中allocator類使用示例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Qt掃盲篇之QRegExp正則匹配類總結

    Qt掃盲篇之QRegExp正則匹配類總結

    這篇文章主要給大家介紹了關于Qt掃盲篇之QRegExp正則匹配類總結的相關資料,QRegExp是Qt框架中的一個類,用于進行正則表達式的匹配和處理,它提供了多種模式來匹配不同的字符串,需要的朋友可以參考下
    2023-12-12
  • C++ 私有析構函數(shù)的作用示例詳解

    C++ 私有析構函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構函數(shù)的作用,私有析構函數(shù)不會影響棧上對象的自動析構,它們會在其作用域結束時自動調用析構函數(shù)。私有析構函數(shù)主要影響的是對堆上對象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • C++右值引用與move和forward函數(shù)的使用詳解

    C++右值引用與move和forward函數(shù)的使用詳解

    為了支持移動操作,新標準引入了一種新的引用類型——右值引用(rvalue reference)。所謂右值引用就是必須綁定到右值的引用,這篇文章主要介紹了C++右值引用與move和forward的使用
    2022-08-08
  • C++文件關鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    C++文件關鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    這篇文章主要為大家介紹了C++文件關鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 詳解C++中的自動存儲

    詳解C++中的自動存儲

    這篇文章主要介紹了詳解C++中的自動存儲,幫助大家更好的理解和學習C++,感興趣的朋友可以了解下
    2020-09-09

最新評論

长泰县| 宜都市| 平和县| 台东市| 合山市| 盈江县| 武宁县| 拉萨市| 洛隆县| 行唐县| 锡林郭勒盟| 宁阳县| 射洪县| 临夏市| 浑源县| 金溪县| 宝丰县| 宿松县| 兖州市| 西峡县| 永新县| 温州市| 安徽省| 烟台市| 成武县| 彭泽县| 涿鹿县| 仁寿县| 涟源市| 张家港市| 诸城市| 达拉特旗| 盱眙县| 扎鲁特旗| 开阳县| 荔浦县| 通榆县| 香港| 巩留县| 石渠县| 绥芬河市|