Может по-простому, циферка за циферкой? В полтора раза быстрее работает, судя по твоим же тестам. VC 7.1 Release, Optimize speed.
bool isValidIP(const char* ip)
{
if (!ip)
return false;
for (int j = 0 ; j < 4 ; ++j)
{
int i = 0;
while (i < 3 && ip[i] && ip[i] != '.')
++i;
char limit = '9';
switch(i)
{
case 3:
if (*ip < 0 || *ip > '2')
return false;
if (*ip == '2')
limit = '5';
++ip;
case 2:
if (*ip < 0 || *ip > limit)
return false;
if (*ip < limit)
limit = '9';
++ip;
case 1:
if (*ip < 0 || *ip > limit)
return false;
++ip;
break;
case 0:
return false;
}
if (j < 3 && *ip++ != '.')
return false;
}
return *ip == '\0';
}