- 论坛徽章:
- 0
|
应该是目前最快的Trim函数
re FH:
哈哈,不瞒你说,你的函数我也测试了。我将所有的trim函数中判断字符是否空格的地方都使用了一个统一的宏来代替,因此在这个上面应该没有误差。
我测试了一个我自己认为比较典型的例子。
分配100M内存,构造一个20%头部空格,60%中间全部是A字符,最后20%为空格的巨大字符串,运行一次(构造大字符串是因为,我认为全部的时间都是用于trim函数本身的执行,受外界干扰比较小)。结果如下:
0.2 - 0.6 - 0.2 分布情况:
fast_trim time : 250
flw_trim time : 450
winhate_trim time : 271
FH_trim time : 361
源程序如下:
- #include <stdio.h>;
- #include <string.h>;
- #include <memory.h>;
- #include <time.h>;
- #define IS_SPACE(c) (c == ' ' || c == '\t')
- char * fasttrim(char * str)
- {
- char * start, * end = NULL;
- if(str == NULL)
- return NULL;
- while( IS_SPACE(*str) ) str++;
-
- for(start = str; *str != '\0'; str++)
- {
- if ( IS_SPACE(*str) )
- {
- end = str++;
- while( IS_SPACE(*str) ) str++;
- if(*str != '\0')
- end = NULL; }
- }
- if(end) *end = '\0';
- return start;
- }
- void flw_trim( char *str )
- {
- char *copied, *tail = NULL;
- if ( str == NULL )
- return;
- for( copied = str; *str; str++ )
- {
- if ( *str != ' ' && *str != '\t' )
- {
- *copied++ = *str;
- tail = copied;
- }
- else
- {
- if ( tail )
- *copied++ = *str;
- }
- }
- if ( tail )
- *tail = 0;
- else
- *copied = 0;
- return;
- }
- //win_hate
- void winhate_trim (char *str)
- {
- char *save = str;
- char *b;
- if (str == NULL)
- return;
- if (IS_SPACE (*(b = str)))
- {
- while (*b)
- {
- if (IS_SPACE (*b))
- b++;
- else
- break;
- }
- while (*b)
- *str++ = *b++;
- str--;
- while (IS_SPACE (*str))
- str--;
- str[1] = '\0';
- }
- else
- {
- while (*b)
- b++;
- b--;
- while (IS_SPACE (*b))
- b--;
- b[1] = '\0';
- }
- return;
- }
- char *FH_Trim( char *String )
- {
- char *Tail, *Head;
- for ( Tail = String + strlen( String ) - 1; Tail >;= String; Tail -- )
- if ( !IS_SPACE( *Tail ) )
- break;
- Tail[1] = 0;
- for ( Head = String; Head <= Tail; Head ++ )
- if ( !IS_SPACE( *Head ) )
- break;
- if ( Head != String )
- memcpy( String, Head, ( Tail - Head + 2 ) * sizeof( char ) );
- return String;
- }
- int main(int argc, char* argv[])
- {
- int time;
-
- const int test_len = 100 * 1024 * 1024;
- const int head_space = (int)(test_len * 0.2);
- const int tail_space = (int)(test_len * 0.2);
- char * teststr = new char[test_len];
- #define INIT_TESTSTR \
- memset(teststr, 'A', test_len); \
- memset(teststr, ' ', head_space); \
- memset(teststr + test_len - tail_space, ' ', tail_space); \
- teststr[test_len - 1] = '\0';
- INIT_TESTSTR
- time = clock();
- fasttrim(teststr);
- printf("fast_trim time : %d\n", clock() - time);
- INIT_TESTSTR
- time = clock();
- flw_trim(teststr);
- printf("flw_trim time : %d\n", clock() - time);
- INIT_TESTSTR
- time = clock();
- winhate_trim(teststr);
- printf("winhate_trim time : %d\n", clock() - time);
-
- INIT_TESTSTR
- time = clock();
- FH_Trim(teststr);
- printf("FH_trim time : %d\n", clock() - time);
- delete[] teststr;
- return 0;
- }
复制代码 |
|