效率测试:
#include "jtianling.h"
#define __isasciims(_Char) ( (unsigned)(_Char) < 0x80 )
#define __isasciigcc(c) (((c) & ~0x7f) == 0) /* if C is a 7 bit value*/
const int DEF_TEST_TIMES = 1000000000;
void CheckMS(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i<DEF_TEST_TIMES ; ++i)
{
__isasciims(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciims %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
void Checkgcc(char ac)
{
double ldTimeLast = jtianling::GetTime();
for (int i=0; i<DEF_TEST_TIMES ; ++i)
{
__isasciigcc(ac);
}
double ldTimePast = jtianling::GetTime() - ldTimeLast;
printf("__isasciigcc %c run %d times cost %lf secs.\n", ac, DEF_TEST_TIMES, ldTimePast);
}
int _tmain(int argc, _TCHAR* argv[])
{
char lc = 'a';
char lc2 = '中';
CheckMS(lc);
Checkgcc(lc);
CheckMS(lc);
Checkgcc(lc2);
return 0;
}
至于GetTime函数的意义,请参考我以前写的库,无非就是获取当前时间,不知道也没有关系。你可以用time(NULL)来替代,只不过精度没有这个函数高而已。
实际的测试结果很让人失望,在测试了几乎无数次以后,MS和gcc的实现效率都几乎相同,在10亿这个级别,gcc也不过有时快0.1秒而已,而且多次运行,还不是太稳定。看来并不是复杂的实现就一定好。。。
相关函数:
msdn:
Converts characters.
int __toascii(
int c
);
这个函数也是一个双前置下划线的函数,MS,gcc中都有实现。而且在此时,实现都是一样的。
#define __toascii(_Char) ( (_Char) & 0x7f )
gcc注释到 “mask off high bits.”
这里和gcc中__isascii函数实现的前一部分很像,一个是去除低七位,一个是保留低七位。看了这个以后才知道gcc为什么想到这样实现__isascii了。