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

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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

strcat在某種特定條件下的優化

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

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


由此可見,strcat調用時,先移動目標字符串的指針到其尾部,再進行復制。這種做法對于下標比較大的數組重復調用時,效率比較低。想象一下,第一次調用strcat時,指針由0數到100,只不過復制了幾個字符,第二次調用strcat時,指針又從0數到108,無論調用多少次,指針總是從0數起,就會知道這個時候是多么浪費系統資源了!

我找到一個辦法,字符串追加時,事先給出目標字符串結尾所在的位置,追加時,也就不用從頭開始計算其長度了,復制的過程中,目標字符串的結尾也隨之移動,下一次再追加也就可以使用它了。以下就是優化過的string_append,與strcat相比,增加了一個整形指針以傳遞目標字符串長度的地址。

/*
 * 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;
}


經試驗,string_append在大數組重復追加內容的情形下,優勢非常明顯。其它情形下,使用原來的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博客,轉載請標明出處:http://blog.csdn.net/yui/archive/2010/05/22/5616455.aspx

Feedback

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

原始的strcat一樣會溢出,這個問題應該由調用者負責

# re: strcat在某種特定條件下的優化[未登錄]  回復  更多評論   

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

# re: strcat在某種特定條件下的優化  回復  更多評論   

2010-07-30 06:10 by hoodlum1980
在現實應用里,都是隨機化的處理,使用你的方法,實際上還需要求一次strlen,這樣也就沒有什么優勢(和實用性)可言了。
這是C字符串模型的一種特點(在這里體現出是缺點,但在其他大部分地方都體現的是高效和靈活性)導致的,例如其他有些語言的字符串是在前面存儲字符串長度的,但是這樣相對而言對字符串處理庫函數會提高一些維護難度,因為總是要同時照顧這個長度信息。

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

這個例子中,從來沒用到strlen,而且,這是在某種特定條件下的優化,初始值是空串,長度為0,請看清楚

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

唉,我反而覺得你沒理解好,你是說每次調用string_append都要先調用strlen嗎?根本不需要,每次string_append就已經計算了下一次執行時的偏移量了

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

# re: strcat在某種特定條件下的優化  回復  更多評論   

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

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

其次,我并沒有用string_append代替strcat的意思,事實上,通常情況下,我都只用strcat,只有在strcat對效率影響實在太大的時候,才考慮string_append。這個例子中直接用strcpy當然可以,但還是需要strlen計算附加串的長度。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中文欧美在线视频| 亚洲国产日韩欧美在线99| 欧美日韩综合在线免费观看| 欧美成人嫩草网站| 久久蜜桃资源一区二区老牛 | 久久这里只有| 一区电影在线观看| 亚洲一二三区精品| 国产精品一区二区三区久久| 国产午夜精品久久久久久免费视| 99国产麻豆精品| 亚洲国产天堂久久综合| 国产偷国产偷亚洲高清97cao| 久久综合给合久久狠狠狠97色69| 亚洲天堂第二页| 宅男在线国产精品| 欧美v亚洲v综合ⅴ国产v| 欧美成人激情视频| 欧美日韩精品系列| 国产精品视频内| 亚洲高清激情| 亚洲图色在线| 久久精品国产99精品国产亚洲性色 | 艳妇臀荡乳欲伦亚洲一区| 亚洲一区在线视频| 欧美怡红院视频一区二区三区| 久久先锋资源| 国产精品揄拍500视频| 激情视频一区二区三区| 欧美成人中文字幕| 久久久国产视频91| 欧美日韩亚洲高清| 在线观看亚洲精品视频| 亚洲女人av| 欧美刺激午夜性久久久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久国产一区二区三区| 欧美色一级片| 99热免费精品在线观看| 欧美不卡激情三级在线观看| 亚洲免费一级电影| 欧美图区在线视频| 亚洲精品乱码| 免费在线亚洲| 久久精品欧洲| 国产一区二区三区精品久久久| 国产精品99久久久久久人| 欧美国产日韩一区二区三区| 久久精品国产99国产精品澳门| 国产精品免费观看在线| av成人老司机| 亚洲午夜精品久久久久久浪潮| 亚洲国产一区二区三区青草影视| 性欧美大战久久久久久久免费观看| 欧美国产视频日韩| 亚洲激情视频在线| 欧美 日韩 国产精品免费观看| 欧美一区二区| 亚洲免费在线视频一区 二区| 合欧美一区二区三区| 欧美亚洲日本网站| 中国成人在线视频| 欧美视频成人| 午夜老司机精品| 欧美一区二区三区视频| 国产亚洲一区二区三区在线播放| 午夜免费在线观看精品视频| 亚洲一二三区视频在线观看| 国产精品丝袜久久久久久app| 午夜精品www| 性欧美xxxx视频在线观看| 国产欧美日本一区视频| 久久精品一本久久99精品| 羞羞视频在线观看欧美| 激情另类综合| 亚洲日本无吗高清不卡| 欧美日韩国产天堂| 亚洲欧美日韩中文在线制服| 午夜日韩av| 亚洲国产精品精华液2区45| 欧美激情国产高清| 欧美日韩亚洲一区二区| 午夜精品影院| 噜噜噜在线观看免费视频日韩 | 快播亚洲色图| 99亚洲伊人久久精品影院红桃| 欧美freesex交免费视频| 裸体丰满少妇做受久久99精品 | 久久成人精品无人区| 久久久蜜桃一区二区人| 一本色道久久综合亚洲91| 亚洲一区欧美激情| 亚洲二区在线视频| 亚洲美女免费精品视频在线观看| 国产精品理论片| 麻豆国产精品777777在线| 欧美国产日韩一区| 久久福利影视| 欧美ed2k| 久久精彩视频| 欧美日本韩国在线| 老**午夜毛片一区二区三区| 欧美日韩精品系列| 欧美大片18| 国产亚洲二区| 亚洲精品一区二区三| 国产午夜精品久久久久久免费视 | 久久久噜噜噜久久| 欧美va亚洲va国产综合| 亚洲精品乱码久久久久久日本蜜臀| 亚洲欧洲一区二区在线观看| 亚洲高清久久| 影音先锋亚洲视频| 欧美一区二视频| 狂野欧美激情性xxxx| 欧美日韩免费一区| 久久福利毛片| 亚洲一区二区三区在线| 亚洲一区精品电影| 国产精品爽爽ⅴa在线观看| 亚洲国产精品久久久久秋霞蜜臀| 国产性做久久久久久| 一区二区不卡在线视频 午夜欧美不卡'| 欧美一区二区成人6969| 99精品99久久久久久宅男| 欧美日韩国产小视频在线观看| 久久久人成影片一区二区三区观看 | 国产免费观看久久| 欧美成人在线免费观看| 欧美亚洲网站| 国产亚洲视频在线| 亚洲欧美激情四射在线日 | 欧美呦呦网站| 久久精品国产清自在天天线 | 性欧美8khd高清极品| 亚洲国内精品| 久久精品国产久精国产一老狼| 欧美日韩精品二区| 亚洲高清成人| 国产精品热久久久久夜色精品三区| 亚洲欧美日本国产有色| 久久亚洲综合网| 欧美成熟视频| 一本色道婷婷久久欧美| 亚洲无亚洲人成网站77777| 欧美国产日韩a欧美在线观看| 免费不卡在线观看av| 免费观看在线综合| 99视频国产精品免费观看| 亚洲激情国产精品| 亚洲国产乱码最新视频| 亚洲一区二区三区在线| 亚洲小说欧美另类社区| 午夜在线成人av| 99精品热视频| 欧美黄色一区| 亚洲男人的天堂在线观看| 亚洲黄色性网站| 免费在线日韩av| 欧美在线视频全部完| 国产伦精品一区二区三区在线观看| 一区二区在线视频播放| 国内精品久久久久久久果冻传媒| 久久美女艺术照精彩视频福利播放| 在线观看91精品国产入口| 在线亚洲一区观看| 一本久久知道综合久久| 另类亚洲自拍| 久久精品国产77777蜜臀| 美日韩丰满少妇在线观看| 国产精品草草| 免费看的黄色欧美网站| 一区二区亚洲精品国产| 亚洲一区二区毛片| 亚洲免费在线观看| 国产精品日韩欧美| 一本色道久久综合亚洲精品婷婷| 亚洲国产婷婷综合在线精品| 美女图片一区二区| 久色成人在线| 亚洲成人在线| 噜噜噜久久亚洲精品国产品小说| 亚洲欧美日韩国产中文| 欧美日韩第一区| 亚洲欧美视频在线| 亚洲影视中文字幕| 亚洲人成绝费网站色www| 欧美激情一区| 性视频1819p久久| 精品成人在线| 亚洲国产高清在线| 久久不射2019中文字幕| 国产精品久久国产精品99gif | 91久久精品日日躁夜夜躁欧美| 在线亚洲精品福利网址导航| 99re热精品| 91久久国产综合久久91精品网站| 免费国产自线拍一欧美视频| 蜜臀91精品一区二区三区| 99热这里只有精品8|