论坛首页 Java企业应用论坛

吹牛:我写的JSONParser可能是这个星球上最快了(Java)

浏览 143282 次
该帖已经被评为精华帖
作者 正文
   发表时间: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就行了么?

非数字字符会导致数组越界访问错误
0 请登录后投票
   发表时间:2010-12-22  
LZ这次搞不好,影响个人是小,但影响你所在的公司事大啊
0 请登录后投票
   发表时间:2010-12-22  
8210 写道
wenshao 写道
sdh5724 写道
毛人温少, 你不吹牛要死人啊。 等我下去看看代码, 要是被我发现有改进的余地, 我要让你这儿跪上三天三夜, 向人民谢罪~


就在/ali_platform/incubator/fast-json/trunk下,尽管看!!!



/ali_platform/incubator/fast-json/trunk这是相对地址啊,如何访问啊



这个回复有点意思
0 请登录后投票
   发表时间:2010-12-22  
楼主强悍。

为了保险和稳定,我还是继续用 jackson 的 json处理库,已经够快了,并且是 spring 3 mvc 推荐和依赖的 库。
0 请登录后投票
   发表时间:2010-12-22   最后修改:2010-12-22
windlike 写道
要那么快有个鸟用

"鸟"的用处可大了!!!  你懂的~~~
0 请登录后投票
   发表时间:2010-12-22   最后修改:2010-12-22
又修正了其中数值的parser实现,性能有所提升。
原来是:
char[] -> String -> Long.parseLong(String)
现在优化为Lexer.parseLong(char[]),把Long.parseLong的代码拿过来,直接放到Lexer中,这个改动的结果是性能又有所提升。
0 请登录后投票
   发表时间: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)更靠谱一点。
0 请登录后投票
   发表时间: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就行了么?

非数字字符会导致数组越界访问错误


真牛逼 完全没想到
空间换效率哈
多谢指教
0 请登录后投票
   发表时间:2010-12-22  
无代码无真相,接受大家的检验才能真正的快
0 请登录后投票
   发表时间: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中,我的写法是可用的,但不是用于所有场景。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics