一天一个CRT函数 memcmp
2009-12-18 14:43
225 查看
今天接着Buffer Manipulation函数的介绍,刚开始的几个函数算法都相当简单,没有什么可比性。权当练习打字吧~咳咳~
3.memcmp/wmemcmp
实现
测试
这里提供两种测试环境(VS2008 + Release模式):
Unicode下:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/chenyu2202863/632188/o_Test1_thumb_633967441996013750.jpg)
Ascii下:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/chenyu2202863/632188/o_image_thumb.png)
结果:
很明显,M$的汇编实现效率实在是高,Unicode下比多字节快几乎一倍(前提是自己的函数实现,而汇编则没怎么受影响!)
还是那句话:非专业人士的测试都不可靠!
3.memcmp/wmemcmp
实现
/**** Purpose: 比较内存区域buf1和buf2的前uCnt个字节 Entry: T *buf1 - buffer1 T *buf2 - buffer2 unsigned cnt - max number of bytes to search Exit: < 0 buf1 小于 buf2 = 0 buf1 等于 buf2 > 0 buf1 大于 buf2 Uses: Exceptions: ***/ template<typename T> inline int tMemCmp(T *pBuf1, T *pBuf2, unsigned int uCnt) { while( uCnt ) { if( *pBuf1++ != *pBuf2++ ) // pBuf1[-1]、pBuf2[-1]是退回到不相等的字符处再进行比较 return pBuf1[-1] < pBuf2[-1] ? -1 : 1; --uCnt; } return 0; }
测试
volatile tChar first[] = _T("123456789012345678901234567890123456789012345678901234567890"); volatile tChar second[] = _T("123456789012345678901234567890123456789012345678901234567890"); volatile int nArr1[] = {1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4}; volatile int nArr2[] = {1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 1, 2, 3, 5, 3}; int result; volatile const DWORD dwCount = 10000000; DWORD dwLast = 0; { CCYPerformance timer(dwLast); for(DWORD i = 0; i < dwCount; ++i) { result = memcmp((const void *)first, (const void *)second, sizeof(first) / sizeof(first[0]) ); --result; } } std::cout << dwLast << std::endl; dwLast = 0; { CCYPerformance timer(dwLast); for(DWORD i = 0; i < dwCount; ++i) { result = CY_CRT::tMemCmp( first, second, sizeof(first) / sizeof(first[0]) ); ++result; } } std::cout << dwLast << std::endl;
这里提供两种测试环境(VS2008 + Release模式):
Unicode下:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/chenyu2202863/632188/o_Test1_thumb_633967441996013750.jpg)
Ascii下:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/chenyu2202863/632188/o_image_thumb.png)
结果:
很明显,M$的汇编实现效率实在是高,Unicode下比多字节快几乎一倍(前提是自己的函数实现,而汇编则没怎么受影响!)
还是那句话:非专业人士的测试都不可靠!
相关文章推荐
- 一天一个CRT函数 _strlwr/_strupr
- 一天一个CRT函数 atof
- 一天一个CRT函数 atoi
- 一天一个CRT函数 _strdup
- 一天一个CRT函数 _memccpy
- 一天一个CRT函数 memcpy
- 一天一个CRT函数 _memicmp
- 一天一个CRT函数 strcoll
- 一天一个CRT函数 _strdec
- 一天一个CRT函数 strchr
- 一天一个CRT函数 memmove
- 一天一个CRT函数 _swap
- 一天一个CRT函数 strpbrk
- 一天一个CRT函数 strrev
- 一天一个CRT函数 memchr
- 一天一个CRT函数 memset
- 一天一个CRT函数 __toascii tolower toupper
- 一天一个CRT函数 strcspn
- 一天一个CRT函数 strcspn
- 一天一个CRT函数 strstr