Я некоторое время болтал в своем профилировщике, пытаясь понять, как ускорить общий анализатор журналов, который был узким местом вокруг синтаксического анализа даты, и я пробовал различные алгоритмы для ускорения работы.
То, что я пробовал, что было самым быстрым для меня, было также самым читаемым, но потенциально нестандартным C.
Это хорошо отразилось на GCC, icc, и мой действительно старый и придирчивый компилятор SGI. Поскольку это довольно читаемая оптимизация, где она не делает то, что я хочу?
static int parseMonth(const char *input) {
int rv=-1;
int inputInt=0;
int i=0;
for(i=0; i<4 && input[i]; i++) {
inputInt = (inputInt << 8) | input[i];
}
switch(inputInt) {
case 'Jan/': rv=0; break;
case 'Feb/': rv=1; break;
case 'Mar/': rv=2; break;
case 'Apr/': rv=3; break;
case 'May/': rv=4; break;
case 'Jun/': rv=5; break;
case 'Jul/': rv=6; break;
case 'Aug/': rv=7; break;
case 'Sep/': rv=8; break;
case 'Oct/': rv=9; break;
case 'Nov/': rv=10; break;
case 'Dec/': rv=11; break;
}
return rv;
}