青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The power of C, the power of MD

A problem is a chance to do your best
posts - 11, comments - 22, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

strcat在某種特定條件下的優(yōu)化

Posted on 2010-07-28 21:46 roy 閱讀(2217) 評(píng)論(10)  編輯 收藏 引用 所屬分類: C/C++
strcatC語言一個(gè)基本的字符串操作函數(shù),它的源代碼一般是這樣的。

char *strcat(char *dest, const char *src)   
{   
    
char *tmp = dest;   
    
while (*dest) dest++;   
    
while ((*dest++ = *src++!= '\0');   
    
return tmp;   
}
  


由此可見,strcat調(diào)用時(shí),先移動(dòng)目標(biāo)字符串的指針到其尾部,再進(jìn)行復(fù)制。這種做法對(duì)于下標(biāo)比較大的數(shù)組重復(fù)調(diào)用時(shí),效率比較低。想象一下,第一次調(diào)用strcat時(shí),指針由0數(shù)到100,只不過復(fù)制了幾個(gè)字符,第二次調(diào)用strcat時(shí),指針又從0數(shù)到108,無論調(diào)用多少次,指針總是從0數(shù)起,就會(huì)知道這個(gè)時(shí)候是多么浪費(fèi)系統(tǒng)資源了!

我找到一個(gè)辦法,字符串追加時(shí),事先給出目標(biāo)字符串結(jié)尾所在的位置,追加時(shí),也就不用從頭開始計(jì)算其長度了,復(fù)制的過程中,目標(biāo)字符串的結(jié)尾也隨之移動(dòng),下一次再追加也就可以使用它了。以下就是優(yōu)化過的string_append,與strcat相比,增加了一個(gè)整形指針以傳遞目標(biāo)字符串長度的地址。

/*
 * optimizer for strcat when appending to a large array again and again
 
*/

char *string_append(char *dest, int *end, const char *src) {
    
if ( *end >= 0 && dest && src ) {
        
char *= dest + *end;
        
while ( *p++ = *src++ ) (*end)++;
    }

    
return dest;
}


經(jīng)試驗(yàn),string_append在大數(shù)組重復(fù)追加內(nèi)容的情形下,優(yōu)勢(shì)非常明顯。其它情形下,使用原來的strcat也就足夠了。

#include <stdio.h>
#include 
<string.h>
#include 
<time.h>

#define BUFF_SIZE 4096

/*
 * optimizer for strcat when appending to a large array again and again
 
*/

char *string_append(char *dest, int *end, const char *src) {
    
if ( *end >= 0 && dest && src ) {
        
char *= dest + *end;
        
while ( *p++ = *src++ ) (*end)++;
    }

    
return dest;
}


int main() {
    
int i = 0, j = 0;
    
int retry = 100000;
    
int field = 100;
    
char output1[BUFF_SIZE], output2[BUFF_SIZE];
    time_t time1 
= time(NULL);
    
for ( i = 0; i < retry; i++ ) {
        memset(output1, 
0, BUFF_SIZE);
        
int length = 0;
        string_append(output1, 
&length, "header\n");
        
for ( j = 0; j < field; j++ ) {
            string_append(output1, 
&length, "\tcall detail record ");
            
char c[8];
            sprintf(c, 
"%d", j);
            string_append(output1, 
&length, c);
            string_append(output1, 
&length, "\n");
        }

        string_append(output1, 
&length, "trailer\n");
    }

    time_t time2 
= time(NULL);
    printf(
"It takes %d seconds to show the performance of string_append()\n", time2 - time1);

    time1 
= time(NULL);
    
for ( i = 0; i < retry; i++ ) {
        memset(output2, 
0, BUFF_SIZE);
        strcat(output2, 
"header\n");
        
for ( j = 0; j < field; j++ ) {
            strcat(output2, 
"\tcall detail record ");
            
char c[8];
            sprintf(c, 
"%d", j);
            strcat(output2, c);
            strcat(output2, 
"\n");
        }

        strcat(output2, 
"trailer\n");
    }

    time2 
= time(NULL);
    printf(
"It takes %d seconds to show the performance of strcat()\n", time2 - time1);
    
if ( strcmp(output1, output2) )
        printf(
"They are NOT equal\n");
    
else
        printf(
"They are equal\n");
    
return 0;
}

 

-bash-3.2$ ./string_append_demo

It takes 2 seconds to show the performance of string_append()

It takes 11 seconds to show the performance of strcat()

They are equal


本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yui/archive/2010/05/22/5616455.aspx

Feedback

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-07-28 23:55 by 陳梓瀚(vczh)
所以C++的string類都有記錄長度的。

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-07-29 00:57 by lwch
沒有檢查緩沖區(qū)長度...
會(huì)造成溢出

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-07-29 09:03 by roy
@lwch

原始的strcat一樣會(huì)溢出,這個(gè)問題應(yīng)該由調(diào)用者負(fù)責(zé)

# re: strcat在某種特定條件下的優(yōu)化[未登錄]  回復(fù)  更多評(píng)論   

2010-07-29 12:04 by c++
我的程序里一直在strlen(name)。我想是該考慮string的記錄len。

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-07-30 06:10 by hoodlum1980
在現(xiàn)實(shí)應(yīng)用里,都是隨機(jī)化的處理,使用你的方法,實(shí)際上還需要求一次strlen,這樣也就沒有什么優(yōu)勢(shì)(和實(shí)用性)可言了。
這是C字符串模型的一種特點(diǎn)(在這里體現(xiàn)出是缺點(diǎn),但在其他大部分地方都體現(xiàn)的是高效和靈活性)導(dǎo)致的,例如其他有些語言的字符串是在前面存儲(chǔ)字符串長度的,但是這樣相對(duì)而言對(duì)字符串處理庫函數(shù)會(huì)提高一些維護(hù)難度,因?yàn)榭偸且瑫r(shí)照顧這個(gè)長度信息。

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-08-02 09:24 by roy
@hoodlum1980

這個(gè)例子中,從來沒用到strlen,而且,這是在某種特定條件下的優(yōu)化,初始值是空串,長度為0,請(qǐng)看清楚

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-08-04 09:16 by roy
@hoodlum1980

唉,我反而覺得你沒理解好,你是說每次調(diào)用string_append都要先調(diào)用strlen嗎?根本不需要,每次string_append就已經(jīng)計(jì)算了下一次執(zhí)行時(shí)的偏移量了

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-08-06 02:55 by hoodlum1980
如果是每次你能知道是從哪里連接的場(chǎng)合,你只需要strcpy(s+length, src); 就好了呀。我的意思就是那個(gè)本來就是在常規(guī)場(chǎng)合使用的。也就是說,在你自己維護(hù)的上下文內(nèi),你當(dāng)然能夠盡可能的達(dá)到最精確的控制。但在各種交叉處理之中,strcat相對(duì)而言就是一種最通用和恰當(dāng)?shù)膸旌瘮?shù)之一。同時(shí)C字符串在效率上給了你充分的自由度。我說的就是在特定的應(yīng)用場(chǎng)合當(dāng)然可以根據(jù)其背景做出特定的優(yōu)化,但是要做通用性的實(shí)現(xiàn),因?yàn)榭紤]到通用性,不是所有的假設(shè)都能成立,特定的優(yōu)化可能因而不宜提供,這也是C字符串庫函數(shù)形成現(xiàn)在這個(gè)系列的原因了。

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-08-06 03:02 by hoodlum1980
簡單說,strcat可以說是strlen和strcpy的功能疊加。如果使用strcat,通常也就是不知道字符串長度(但是要保證原來的空間足夠容納連接的字符串)或者不想關(guān)注這個(gè)信息的場(chǎng)合。如果你自己精確的知道或者已經(jīng)維護(hù)了這個(gè)信息,那么你當(dāng)然可以直接使用strcpy,是不是呢?這樣表達(dá)可能有點(diǎn)繞,如有不妥,當(dāng)我沒說把。

# re: strcat在某種特定條件下的優(yōu)化  回復(fù)  更多評(píng)論   

2010-08-06 10:09 by roy
@hoodlum1980

首先感謝你一直關(guān)心拙作,我們都是技術(shù)人員,關(guān)于技術(shù)問題沒什么不能談的,是嗎?

其次,我并沒有用string_append代替strcat的意思,事實(shí)上,通常情況下,我都只用strcat,只有在strcat對(duì)效率影響實(shí)在太大的時(shí)候,才考慮string_append。這個(gè)例子中直接用strcpy當(dāng)然可以,但還是需要strlen計(jì)算附加串的長度。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品久久视频| 久久成人免费视频| 欧美一区二区黄色| 国内激情久久| 男人的天堂亚洲在线| 亚洲欧洲在线一区| 亚洲欧美日韩成人| 国产亚洲欧美日韩美女| 美女视频一区免费观看| 日韩亚洲一区在线播放| 香蕉成人久久| 亚洲大片免费看| 欧美视频免费看| 久久精品国产成人| 亚洲九九九在线观看| 性欧美激情精品| 亚洲国产高清高潮精品美女| 欧美视频三区在线播放| 久久爱www.| 一本久道久久综合婷婷鲸鱼| 久久九九国产精品| 夜夜嗨av一区二区三区网站四季av| 国产精品拍天天在线| 久久久综合精品| 亚洲视频导航| 欧美国产视频在线| 欧美在线视频一区二区三区| 亚洲黄色av一区| 国产精品无码永久免费888| 六月婷婷一区| 亚洲一区影院| 日韩视频一区二区三区在线播放免费观看 | 久久久久9999亚洲精品| 亚洲风情亚aⅴ在线发布| 国产精品啊v在线| 毛片av中文字幕一区二区| 亚洲欧美文学| 99视频一区二区三区| 免费在线观看精品| 欧美影视一区| 亚洲自拍16p| 日韩视频免费在线观看| 永久域名在线精品| 国产午夜精品久久久久久免费视 | 亚洲一本视频| 亚洲日本免费| 欲色影视综合吧| 国产精品亚洲一区二区三区在线| 欧美激情精品久久久久久蜜臀| 久久久精品国产免费观看同学| 亚洲免费在线| 一本色道久久88综合亚洲精品ⅰ| 欧美激情一区在线观看| 久久精品一二三| 亚洲欧美中文日韩v在线观看| 一区二区三区波多野结衣在线观看| 亚洲成人在线| 精品不卡在线| 伊人久久久大香线蕉综合直播| 国产美女精品人人做人人爽| 欧美日韩中文字幕日韩欧美| 欧美理论在线播放| 欧美精品激情在线| 欧美不卡三区| 欧美福利电影在线观看| 欧美成人精品三级在线观看| 毛片精品免费在线观看| 猛男gaygay欧美视频| 女人香蕉久久**毛片精品| 卡一卡二国产精品| 老鸭窝毛片一区二区三区| 久久婷婷麻豆| 久久久久国产一区二区| 久久亚洲春色中文字幕久久久| 久久久久久黄| 久久一区视频| 欧美成人有码| 欧美日韩中文字幕在线| 国产精品―色哟哟| 国产丝袜美腿一区二区三区| 国产视频自拍一区| 在线观看免费视频综合| 亚洲性夜色噜噜噜7777| 亚洲精品免费看| 亚洲人久久久| 一区二区三区视频在线看| 亚洲一二区在线| 欧美一区二区视频免费观看| 久久国产精品一区二区三区四区| 久久久久久久久久久久久久一区| 老巨人导航500精品| 欧美激情中文不卡| 亚洲美女视频| 亚洲专区一二三| 香蕉成人久久| 久久av一区二区三区亚洲| 免费观看成人网| 欧美欧美在线| 国产欧美精品在线播放| 精品不卡一区| 亚洲精品一二三区| 亚洲欧美在线免费观看| 久久综合狠狠| 亚洲精品国产精品乱码不99按摩| 一区二区三区精品久久久| 久久国产精品72免费观看| 欧美黄色日本| 国产专区精品视频| 亚洲麻豆一区| 欧美在线视频一区二区三区| 亚洲国产精品va在线看黑人动漫 | 最近中文字幕日韩精品 | 亚洲第一福利视频| 亚洲伊人一本大道中文字幕| 久久综合九色欧美综合狠狠| 欧美日韩三区四区| 在线精品国精品国产尤物884a| 99re6热在线精品视频播放速度| 午夜精品美女自拍福到在线 | 久久精品国产69国产精品亚洲 | 亚洲欧美在线一区| 欧美激情一二区| 午夜精品国产| 欧美日韩精品久久久| 精品动漫一区| 亚洲综合第一页| 亚洲国产经典视频| 久久成人免费视频| 国产精品久久77777| 日韩午夜精品视频| 欧美电影电视剧在线观看| 亚洲在线观看| 欧美视频日韩| 日韩视频在线一区二区三区| 免费成人激情视频| 欧美一区二区性| 国产精品国码视频| 一个色综合导航| 最新国产乱人伦偷精品免费网站| 久久国产综合精品| 国产视频一区在线观看| 亚洲欧美精品中文字幕在线| 亚洲美女在线一区| 欧美肥婆在线| 亚洲精品国产精品国自产观看| 久热精品视频在线| 亚欧成人精品| 国产一区二区三区成人欧美日韩在线观看 | 一区二区三区精密机械公司| 欧美国产综合| 欧美777四色影视在线| 亚洲二区视频在线| 蜜臀99久久精品久久久久久软件| 性18欧美另类| 国产一区二区中文| 久久久国产精品一区二区三区| 亚洲免费小视频| 国产精品免费在线| 久久av一区二区三区| 亚洲自拍偷拍福利| 国产亚洲人成a一在线v站 | 欧美电影免费观看网站| 亚洲经典自拍| 亚洲国产一二三| 欧美成人免费小视频| 亚洲免费av网站| 亚洲精品国产精品国自产观看| 欧美激情综合五月色丁香| 亚洲精品中文字幕女同| 亚洲伦理精品| 欧美性猛交xxxx乱大交退制版| 亚洲免费婷婷| 性欧美精品高清| 亚洲第一精品夜夜躁人人躁| 欧美国产视频在线观看| 欧美精品二区| 亚洲欧美日韩在线一区| 亚洲一区二区视频在线观看| 国产女人精品视频| 久久久噜噜噜| 欧美福利在线| 亚洲女爱视频在线| 欧美一区二区视频97| 亚洲国产高清一区| 夜夜嗨av一区二区三区四季av | 蜜臀久久99精品久久久画质超高清| 亚洲精品自在久久| 亚洲一区二区成人| 伊大人香蕉综合8在线视| 亚洲黄页视频免费观看| 国产精品久久久久久av下载红粉| 久久不射网站| 欧美gay视频| 午夜精品视频在线| 久久午夜视频| 一区二区av在线| 久久av一区二区三区亚洲| 日韩亚洲欧美在线观看| 午夜精品影院在线观看| 亚洲精品乱码久久久久久蜜桃91|