簡體   English   中英

strncpy需要很長時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM