效率測試:
#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了。