RT,在最优解的代码上进行了优化,现在变成了新的最优解,但是个人认为这段代码并没有达到极限,以下是一些问题:
isdigit/isspace 更快的判断数字/空格的方法(比较运算符几乎不可能快于这两个函数)?#include<stdio.h>
#include<stdint.h>
#include<string.h>
#include<sys/mman.h>
#include<sys/stat.h>
// #include<ctype.h> C 语言注释后会更快
// #define int unsigned
#define $ ((int)-1)
#define _ $,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$
#define __ _,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_
const int _mp[0x10000] = {__,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,0,10,20,30,40,50,60,70,80,90,_,_,_,1,11,21,31,41,51,61,71,81,91,_,_,_,2,12,22,32,42,52,62,72,82,92,_,_,_,3,13,23,33,43,53,63,73,83,93,_,_,_,4,14,24,34,44,54,64,74,84,94,_,_,_,5,15,25,35,45,55,65,75,85,95,_,_,_,6,16,26,36,46,56,66,76,86,96,_,_,_,7,17,27,37,47,57,67,77,87,97,_,_,_,8,18,28,38,48,58,68,78,88,98,_,_,_,9,19,29,39,49,59,69,79,89,99,__,__,__,__,__,__,__,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$};
#undef $
#undef _
#undef __
main(){
register int v,f,n=0,ans=0;
struct stat s; fstat(0,&s);
register unsigned char* c=(unsigned char*)mmap(NULL,s.st_size,1,2,0,0);
while (isdigit(*c)) n=n*10+(15&*c++);
while (isspace(*c)) ++c;
for (;n--;++c){
v=0,__builtin_expect(~_mp[*(uint16_t*)(c+=f=(*c==45))], 1) && (v=_mp[*(uint16_t*)(c)],c+=2),
~_mp[*(uint16_t*)(c)] && (v=v*100+_mp[*(uint16_t*)(c)],c+=2),
~_mp[*(uint16_t*)(c)] && (v=v*100+_mp[*(uint16_t*)(c)],c+=2),
~_mp[*(uint16_t*)(c)] && (v=v*100+_mp[*(uint16_t*)(c)],c+=2),
isdigit(*c) && (v=v*10+(15&*c++)),
ans+=(f?-v:v);
}
printf("%d", ans);
return 0;
}