该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-22
superwwt 写道 sky3380 写道 wenshao 写道 谢谢校长进行codereview,指出了其中isDigit函数的问题,尝试多种办法测试之后,发现综合最快的是范围判断。linux kernel的isDigit算法,在Java中性能不稳定,只是在Windows XP 32bit JVM中-client参数时最快,其他测试环境都慢。
最终采用的实现如下,很简单的: public final boolean isDigit(char ch) { return ch >= '0' && ch <= '9'; } linux kernel的isDigit算法如下: private static final boolean[] digitBits = new boolean[256]; static { for (char ch = '0'; ch <= '9'; ++ch) { digitBits[ch] = true; } } public final boolean isDigit(char ch) { return digitBits[ch]; } 这是典型的空间换时间的思路,但在java中,这是性能不稳定的算法,估计是hotspot搞鬼了。 这次调整之后,性能又提升了几个百分点。 请教一下,为什么不能用Character.isDigit(c),也是因为性能吗? 为啥是256个呢?不就只要判断0-9就行了么? 非数字字符会导致数组越界访问错误 |
|
返回顶楼 | |
发表时间:2010-12-22
LZ这次搞不好,影响个人是小,但影响你所在的公司事大啊
|
|
返回顶楼 | |
发表时间:2010-12-22
8210 写道 wenshao 写道 sdh5724 写道 毛人温少, 你不吹牛要死人啊。 等我下去看看代码, 要是被我发现有改进的余地, 我要让你这儿跪上三天三夜, 向人民谢罪~
就在/ali_platform/incubator/fast-json/trunk下,尽管看!!! /ali_platform/incubator/fast-json/trunk这是相对地址啊,如何访问啊 这个回复有点意思 |
|
返回顶楼 | |
发表时间:2010-12-22
楼主强悍。
为了保险和稳定,我还是继续用 jackson 的 json处理库,已经够快了,并且是 spring 3 mvc 推荐和依赖的 库。 |
|
返回顶楼 | |
发表时间:2010-12-22
最后修改:2010-12-22
windlike 写道 要那么快有个鸟用
"鸟"的用处可大了!!! 你懂的~~~ |
|
返回顶楼 | |
发表时间:2010-12-22
最后修改:2010-12-22
又修正了其中数值的parser实现,性能有所提升。
原来是: char[] -> String -> Long.parseLong(String) 现在优化为Lexer.parseLong(char[]),把Long.parseLong的代码拿过来,直接放到Lexer中,这个改动的结果是性能又有所提升。 |
|
返回顶楼 | |
发表时间:2010-12-22
wenshao 写道 superwwt 写道 sky3380 写道 wenshao 写道 谢谢校长进行codereview,指出了其中isDigit函数的问题,尝试多种办法测试之后,发现综合最快的是范围判断。linux kernel的isDigit算法,在Java中性能不稳定,只是在Windows XP 32bit JVM中-client参数时最快,其他测试环境都慢。
最终采用的实现如下,很简单的: public final boolean isDigit(char ch) { return ch >= '0' && ch <= '9'; } linux kernel的isDigit算法如下: private static final boolean[] digitBits = new boolean[256]; static { for (char ch = '0'; ch <= '9'; ++ch) { digitBits[ch] = true; } } public final boolean isDigit(char ch) { return digitBits[ch]; } 这是典型的空间换时间的思路,但在java中,这是性能不稳定的算法,估计是hotspot搞鬼了。 这次调整之后,性能又提升了几个百分点。 请教一下,为什么不能用Character.isDigit(c),也是因为性能吗? 为啥是256个呢?不就只要判断0-9就行了么? 非数字字符会导致数组越界访问错误 如果isDigit('非')还是会数组越界啊~~,所以Character.isDigit里的if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX)更靠谱一点。 |
|
返回顶楼 | |
发表时间:2010-12-22
最后修改:2010-12-22
wenshao 写道 superwwt 写道 sky3380 写道 wenshao 写道 谢谢校长进行codereview,指出了其中isDigit函数的问题,尝试多种办法测试之后,发现综合最快的是范围判断。linux kernel的isDigit算法,在Java中性能不稳定,只是在Windows XP 32bit JVM中-client参数时最快,其他测试环境都慢。
最终采用的实现如下,很简单的: public final boolean isDigit(char ch) { return ch >= '0' && ch <= '9'; } linux kernel的isDigit算法如下: private static final boolean[] digitBits = new boolean[256]; static { for (char ch = '0'; ch <= '9'; ++ch) { digitBits[ch] = true; } } public final boolean isDigit(char ch) { return digitBits[ch]; } 这是典型的空间换时间的思路,但在java中,这是性能不稳定的算法,估计是hotspot搞鬼了。 这次调整之后,性能又提升了几个百分点。 请教一下,为什么不能用Character.isDigit(c),也是因为性能吗? 为啥是256个呢?不就只要判断0-9就行了么? 非数字字符会导致数组越界访问错误 真牛逼 完全没想到 空间换效率哈 多谢指教 |
|
返回顶楼 | |
发表时间:2010-12-22
无代码无真相,接受大家的检验才能真正的快
|
|
返回顶楼 | |
发表时间:2010-12-22
myyate 写道 wenshao 写道 superwwt 写道 sky3380 写道 wenshao 写道 谢谢校长进行codereview,指出了其中isDigit函数的问题,尝试多种办法测试之后,发现综合最快的是范围判断。linux kernel的isDigit算法,在Java中性能不稳定,只是在Windows XP 32bit JVM中-client参数时最快,其他测试环境都慢。
最终采用的实现如下,很简单的: public final boolean isDigit(char ch) { return ch >= '0' && ch <= '9'; } linux kernel的isDigit算法如下: private static final boolean[] digitBits = new boolean[256]; static { for (char ch = '0'; ch <= '9'; ++ch) { digitBits[ch] = true; } } public final boolean isDigit(char ch) { return digitBits[ch]; } 这是典型的空间换时间的思路,但在java中,这是性能不稳定的算法,估计是hotspot搞鬼了。 这次调整之后,性能又提升了几个百分点。 请教一下,为什么不能用Character.isDigit(c),也是因为性能吗? 为啥是256个呢?不就只要判断0-9就行了么? 非数字字符会导致数组越界访问错误 如果isDigit('非')还是会数组越界啊~~,所以Character.isDigit里的if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX)更靠谱一点。 你说的对,不过在json parser中,我的写法是可用的,但不是用于所有场景。 |
|
返回顶楼 | |