[英]strncpy taking a long time
我最近遇到了一些舊代碼,並注意到有時(並非總是)以下代碼片段需要很長時間才能執行。
#define NUM_OF_RECORDS 100000
char* pzBuffer = new char[NUM_OF_RECORDS + 1];
strncpy(pzBuffer, "", NUM_OF_RECORDS);
目的似乎是初始化pzBuffer,我同意memcpy或memset是更好的選擇。 我試圖弄清楚為什么要花時間,以及這里的用法是否正確。
由於以下原因,使用memset()
可能會更好:
1) strncpy()
在單個“字符”級別工作,這意味着它將一一遍歷所有字符(在您的情況下為~NUM_OF_RECORDS
迭代)。
2) memset()
在塊級工作,其中一個塊由N個字節組成。 盡管這意味着要遍歷一個塊的各個字節,但此功能是為優化大塊尺寸而設計的,當涉及大塊的塊時,通常可以提高性能。
我建議創建代碼變體1)使用內存集2)其他與strncpy。 然后,編譯它們兩個以生成匯編代碼,並找出指令之間的差異。
http://unix.superglobalmegacorp.com/BSD4.4Lite/newsrc/libkern/strncpy.c.html
像strncpy的標准實現這樣的lok會用零填充數組的所有剩余元素,無論如何。 因此,這樣做需要時間。
do {
if ((*d++ = *s++) == 0) {
/* NUL pad the remaining n-1 bytes */
while (--n != 0)
*d++ = 0;
break;
}
} while (--n != 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.