偶尔吹毛求疵一下,众所周知,各种数值类型的Parse方法是很耗时间的。比如定义一个string s = "123",int n = 123,我们看s到n之间,没有任何理解障碍。但计算机就不行,它要一堆转换才能明白s到n的关系。下面写了一个自定义的类型转换函数。
没有用Math.Pow函数求幂,速度提高了两倍;将自定义求幂函数与主函数合并一起,速度快了近一倍;使用while而不是for循环,速度略有提高。如果加上转换失败处理,总体速度大约比Int.Parse快一倍。
Code
static int ParseInt(string s)
{
int L = s.Length - 1; int n = 0, result = 0;
while (L >= 0)
{
int x = 1, y = n;
while (y > 0)
{
x = x * 10;
y--;
}
result += (s[L] - 48) * x;
n++;
L--;
}
return result;
}
但是,要将速度提高一个数量级,找不到思路了。又仔细想了一下,其实完全不用取幂的。
Code
static int ParseInt(string s)
{
int L = s.Length - 1; int n = 1, result = 0;
while (L >= 0)
{
int c = s[L] - 48;
if (c > 9 || c < 0) throw new InvalidCastException();
result += c * n;
n *= 10;
L--;
}
return result;
}
这样速度又提高了近20%,看来传统方式潜力不大了,不知道是不是应该从指针直接操作内存入手呢?