- 浏览: 271688 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lwb314:
String相加不支持啊
阿里巴巴开源项目SimpleEL发布0.1版本 -
lwb314:
if后边连续接多个else if 好像不支持
阿里巴巴开源项目SimpleEL发布0.1版本 -
lwb314:
之前的文档都已经不能下载了,请问一下。我如果希望同时执行如下代 ...
阿里巴巴开源项目SimpleEL发布0.1版本 -
loowii:
为什么“http://code.alibabatech.com ...
阿里巴巴开源平台新增项目Druid -
DarrenD:
不错 并发很基础的介绍
新写了一个Java并发程序设计教程
我拥有多年手写Parser的经验,在以前,编写过多个Parser,有SQL的Parser,也有JavaScript的Parser,也有Java的Parser。
在最近的项目中,也需要使用JSON,其中client部分不希望存在依赖,所以就写了一个JSON Parser。最初是直接使用SimpleJSON的,因为其代码少,接口简洁。一个同事说,SimpleJSON存在性能问题,噢,我想,那算了,我自己写一个吧,JSON语法这么简单,对于有“多年行医经验”(来自典故《日本兵与老中医》)的我,自然不是困难的事情,也就是一个晚上就写完了,应用于项目中,测试结果,网络协议的性能提升了两倍,从原来的80,000 TPS提升到了240,000 TPS。顺带说一个花絮,周六晚上加班写完的,直接就应用到项目中了,虽然有TestCase,但还是有一个地方没注意好,出现了一个Bug,星期一还影响了测试工作,早会的时候被同事血泪控诉。
我跟朋友炫耀了一下,朋友说,为啥不用jackson,jackson速度很快。好吧,我就和jackson做了一个性能比较,在大多数场景都是比jackson性能好很多,但是在某一个场景,竟然比jackson稍慢。我不服气啊,因为一看就觉得jackson的Parser写得不够专业,没理由比我这种多年经验的老鸟快的。跟踪其实现代码找到了其优化的办法,觉得那是取巧,不屑于使用。于是优化一下我写的Parser,优化的结果自然是全面超越它。好吧,废话少说,直接上结果。
场景1:
fast-json : 8,608,334 (我写的parser)
jackson : 17,172,500
simple-json : 36,258,008
场景2:
fast-json : 1,028,024
jackson : 6,673,850
simple-json : 20,294,257
场景3:
fast-json : 842,032
jackson : 7,284,100
simple-json : 20,553,188
场景4:
fast-json : 1,338,822
jackson : 10,000,239
simple-json : 20,202,679
场景5:
fast-json : 389,004
jackson : 5,405,129
simple-json : 20,418,252
以上的结果都是执行一千次的时间总和,单位是nano。连续执行测试50次,取最后一次的结果,让JVM能够充分优化。JVM的参数是-server。
结论,越简单的对象,偶写的parser(fast-json)性能越好。如场景3,都快差不多100倍了。
好了,吹牛结束啦,有什么后续动作呢?有同事建议开源,嗯,这个建议挺好的,我喜欢用开源的东西,也希望对开源有所贡献,我整理好代码之后,就会开源出来。
注明,我写的Parser是能通过JSON官方的兼容性测试的,不是缺乏功能的残废!
----------------------------------------------
svn已经能够外网访问:
http://119.38.217.15/svn/fastjson/trunk/
(注意,IP地址在2011-1-10修改过)
域名申请的事情还在进行中,还有很多事情要做。最终这是一个类似taobao code(淘蝌蚪)的开源平台,我们的名字叫做Open Sesame。
温少,身为阿里的大P,说话可要严谨奥,有些事情可以拍脑袋想,但是要讲出来,还是要思量,经过验证,总说“性能提高几个百分点”,什么情况,到底几个?测试的场景是啥子?牛可以吹,但是骨子里还是要严谨的啊
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
为啥是256个呢?不就只要判断0-9就行了么?
非数字字符会导致数组越界访问错误
如果isDigit('非')还是会数组越界啊~~,所以Character.isDigit里的if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX)更靠谱一点。
你说的对,不过在json parser中,我的写法是可用的,但不是用于所有场景。
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
为啥是256个呢?不就只要判断0-9就行了么?
非数字字符会导致数组越界访问错误
真牛逼 完全没想到
空间换效率哈
多谢指教
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
为啥是256个呢?不就只要判断0-9就行了么?
非数字字符会导致数组越界访问错误
如果isDigit('非')还是会数组越界啊~~,所以Character.isDigit里的if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX)更靠谱一点。
"鸟"的用处可大了!!! 你懂的~~~
就在/ali_platform/incubator/fast-json/trunk下,尽管看!!!
/ali_platform/incubator/fast-json/trunk这是相对地址啊,如何访问啊
这个回复有点意思
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
为啥是256个呢?不就只要判断0-9就行了么?
非数字字符会导致数组越界访问错误
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
正确,那个性能很差的!
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
为啥是256个呢?不就只要判断0-9就行了么?
请教一下,为什么不能用Character.isDigit(c),也是因为性能吗?
在最近的项目中,也需要使用JSON,其中client部分不希望存在依赖,所以就写了一个JSON Parser。最初是直接使用SimpleJSON的,因为其代码少,接口简洁。一个同事说,SimpleJSON存在性能问题,噢,我想,那算了,我自己写一个吧,JSON语法这么简单,对于有“多年行医经验”(来自典故《日本兵与老中医》)的我,自然不是困难的事情,也就是一个晚上就写完了,应用于项目中,测试结果,网络协议的性能提升了两倍,从原来的80,000 TPS提升到了240,000 TPS。顺带说一个花絮,周六晚上加班写完的,直接就应用到项目中了,虽然有TestCase,但还是有一个地方没注意好,出现了一个Bug,星期一还影响了测试工作,早会的时候被同事血泪控诉。
我跟朋友炫耀了一下,朋友说,为啥不用jackson,jackson速度很快。好吧,我就和jackson做了一个性能比较,在大多数场景都是比jackson性能好很多,但是在某一个场景,竟然比jackson稍慢。我不服气啊,因为一看就觉得jackson的Parser写得不够专业,没理由比我这种多年经验的老鸟快的。跟踪其实现代码找到了其优化的办法,觉得那是取巧,不屑于使用。于是优化一下我写的Parser,优化的结果自然是全面超越它。好吧,废话少说,直接上结果。
场景1:
[{"S":321061,"T":"GetAttributeResp"},{"ERROR":null,"TS":0,"VAL":{"SqlList":[{"BatchSizeMax":0,"BatchSizeTotal":0,"ConcurrentMax":1,"DataSource":"jdbc:wrap-jdbc:filters=default,encoding:name=ds-offer:jdbc:mysql://100.10.10.10:8066/xxxx","EffectedRowCount":0,"ErrorCount":0,"ExecuteCount":5,"FetchRowCount":5,"File":null,"ID":2001,"LastError":null,"LastTime":1292742908178,"MaxTimespan":16,"MaxTimespanOccurTime":1292742668191,"Name":null,"RunningCount":0,"SQL":"SELECT @@SQL_MODE","TotalTime":83}]}}]
fast-json : 8,608,334 (我写的parser)
jackson : 17,172,500
simple-json : 36,258,008
场景2:
{"S":321061,"T":"GetAttributeResp"}
fast-json : 1,028,024
jackson : 6,673,850
simple-json : 20,294,257
场景3:
引用
{"name":null,"flag":true}
fast-json : 842,032
jackson : 7,284,100
simple-json : 20,553,188
场景4:
[-5.041598256063065E-20,-7210028408342716000]
fast-json : 1,338,822
jackson : 10,000,239
simple-json : 20,202,679
场景5:
-6470204979932713723
fast-json : 389,004
jackson : 5,405,129
simple-json : 20,418,252
以上的结果都是执行一千次的时间总和,单位是nano。连续执行测试50次,取最后一次的结果,让JVM能够充分优化。JVM的参数是-server。
结论,越简单的对象,偶写的parser(fast-json)性能越好。如场景3,都快差不多100倍了。
好了,吹牛结束啦,有什么后续动作呢?有同事建议开源,嗯,这个建议挺好的,我喜欢用开源的东西,也希望对开源有所贡献,我整理好代码之后,就会开源出来。
注明,我写的Parser是能通过JSON官方的兼容性测试的,不是缺乏功能的残废!
----------------------------------------------
svn已经能够外网访问:
http://119.38.217.15/svn/fastjson/trunk/
(注意,IP地址在2011-1-10修改过)
域名申请的事情还在进行中,还有很多事情要做。最终这是一个类似taobao code(淘蝌蚪)的开源平台,我们的名字叫做Open Sesame。
评论
95 楼
wenshao
2010-12-22
举例说明API:
public static class User { private String name; private int age; private BigDecimal salary; private Date birthdate; // 支持日期 public Date getBirthdate() { return birthdate; } public void setBirthdate(Date birthdate) { this.birthdate = birthdate; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public BigDecimal getSalary() { return salary; } public void setSalary(BigDecimal salary) { this.salary = salary; } } public static class Group { private List<User> users = new ArrayList<User>(); private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<User> getUsers() { return users; } // 支持泛性 // 还支持另外一种写法 public void setUsers(List<? extends User> users) public void setUsers(List<User> users) { this.users = users; } } public void testComposite() throws Exception { Group group = new Group(); group.setName("神棍"); User user = new User(); user.setName("校长"); user.setAge(3); user.setSalary(new BigDecimal("123456789.0123")); user.setSalary(new BigDecimal("123456789.0123")); group.getUsers().add(user); String jsonString = JSON.toJSONStringEx(group); System.out.println(jsonString); JSON.parseObject(jsonString); Group group1 = JSON.parseObject(Group.class, jsonString); Assert.assertEquals(group.getName(), group1.getName()); User user1 = group1.getUsers().get(0); Assert.assertEquals(user.getAge(), user1.getAge()); Assert.assertEquals(user.getName(), user1.getName()); Assert.assertEquals(user.getSalary(), user1.getSalary()); }
94 楼
fengjia10
2010-12-22
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
温少,身为阿里的大P,说话可要严谨奥,有些事情可以拍脑袋想,但是要讲出来,还是要思量,经过验证,总说“性能提高几个百分点”,什么情况,到底几个?测试的场景是啥子?牛可以吹,但是骨子里还是要严谨的啊
93 楼
wenshao
2010-12-22
举例:
User user = new User(); List<User> userList = new ArrayList<User>(); String jsonString1 = JSON.toJSONStringEx(user); String jsonString2 = JSON.toJSONStringEx(userList); User user1 = JSON.parseObject(User.class, jsonString1 ); List<User> userList1 = JSON.parseArray(User.class, jsonString2 );
92 楼
wenshao
2010-12-22
JSON类是主要入口,包括了toJSONString和parse系列方法。
JSON、JSONArray、JSONObject,这样的结构和其他的JSON库是类似的(如SimpleJSON、JSON-lib)。
其余就是Parser和Visitor的结构了。Visitor负责序列化,Parser负责反序列化。
注明一下,这里的Visitor是Visitor模式的变种,缺省Visitor模式的accept方法是在被访问对象中实现的,我这里的情况比较特殊,accept系列方法在Visitor中实现乐。
JSON、JSONArray、JSONObject,这样的结构和其他的JSON库是类似的(如SimpleJSON、JSON-lib)。
其余就是Parser和Visitor的结构了。Visitor负责序列化,Parser负责反序列化。
注明一下,这里的Visitor是Visitor模式的变种,缺省Visitor模式的accept方法是在被访问对象中实现的,我这里的情况比较特殊,accept系列方法在Visitor中实现乐。
91 楼
wenshao
2010-12-22
序列化和反序列化接口初步定义如下:
各部分的结构初步设计完毕,已经考虑了目前已知的各种扩展,大致如下:
各部分的结构初步设计完毕,已经考虑了目前已知的各种扩展,大致如下:
public abstract class JSON { public static Object parse(String text); public static JSONObject parseObject(String text); public static JSONArray parseArray(String text); public static <T> List<T> parseArray(Class<T> clazz, String text); public static <T> T parseObject(Class<T> clazz, String text); public static String toJSONString(Object object); // 输出JSON String public static String toJSONString(Object object, boolean prettyFormat); // 可选格式化输出JSON String public static String toJSONString(Object object, JavaBeanHandler javaBeanHandler); // 使得可以对JavaBean做特别处理 public static String toJSONStringEx(Object object) { // 使用CGLib实现JavaBean的序列化 return toJSONString(object, false, CGLibJavaBeanHandler.getInstance()); } } public interface JSONAware { String toJSONString(); } public interface JSONStreamAware { void writeJSONString(Appendable out); } public class JSONArray extends JSON implements List<Object>, JSONAware { // ... } public class JSONObject extends JSON implements Map<String, Object>, JSONAware { // ... } public interface JSONParser { Object parse(); void parseArray(Collection array); void parseObject(Map object); } // 使用可以扩展JSONParser,使得能够JSONString -> JavaBean,不需要额外的步骤 public interface ExtJSONParser extends JSONParser { void parseObject(Object object); <T> T parseObject(Class<T> clazz); void parseArray(Class<?> clazz, Collection array); } public class DefaultJSONParser implements JSONParser { // ... } public class CGLibExtJSONParser extends DefaultJSONParser implements ExtJSONParser { // ... } public interface JSONVisitor { JavaBeanHandler getJavaBeanHandler(); void setJavaBeanHandler(JavaBeanHandler javaBeanHandler); void accept(Object object); void acceptBean(JSONAware javaBean); void acceptBean(JSONStreamAware javaBean); void acceptBean(Object javaBean); void acceptNull(); void acceptValue(Date value); void acceptValue(Number value); void acceptValue(String value); void acceptValue(Boolean value); void acceptKey(String key); void acceptArray(Collection<?> array); void acceptObject(Map<?, ?> object); void acceptEntry(Map.Entry<?, ?> entry); void visitBean(JSONStreamAware object); void endVisitBean(JSONStreamAware object); void visitBean(JSONAware object); void endVisitBean(JSONAware object); void visitBean(Object object); void endVisitBean(Object object); boolean visitObject(Map<?, ?> map); void endVisitObject(Map<?, ?> map); boolean visitEntry(Map.Entry<?, ?> entry); void endVisitEntry(Map.Entry<?, ?> entry); boolean visitArray(Collection<?> array); void endVisitArray(Collection<?> array); void visitValue(Number value); void endVisitValue(Number value); void visitValue(Date value); void endVisitValue(Date value); void visitValue(boolean value); void endVisitValue(boolean value); void visitValue(String value); void endVisitValue(String value); void visitNull(); void endVisitNull(); boolean visitKey(String key); void endVisitKey(String key); void preVisit(Object value); void postVisit(Object value); } public interface JSONOutputVisitor extends JSONVisitor { Appendable getOut(); void print(char ch); void print(String text); } public class JSONVisitorAdapter implements JSONVisitor { // ... } public class DefaultJSONOutputVisitor extends JSONVisitorAdapter implements JSONOutputVisitor { } public class JSONPrettyFormatOutputVisitor extends DefaultJSONOutputVisitor { } public interface JavaBeanHandler { void handle(Object javaBean, JSONVisitor visitor); } public class CGLibJavaBeanHandler implements JavaBeanHandler { }
90 楼
laogao3232
2010-12-22
看大牛们吹的漫天都是牛!
89 楼
wenshao
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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中,我的写法是可用的,但不是用于所有场景。
88 楼
angel243fly
2010-12-22
无代码无真相,接受大家的检验才能真正的快
87 楼
superwwt
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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就行了么?
非数字字符会导致数组越界访问错误
真牛逼 完全没想到
空间换效率哈
多谢指教
86 楼
myyate
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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)更靠谱一点。
85 楼
wenshao
2010-12-22
又修正了其中数值的parser实现,性能有所提升。
原来是:
char[] -> String -> Long.parseLong(String)
现在优化为Lexer.parseLong(char[]),把Long.parseLong的代码拿过来,直接放到Lexer中,这个改动的结果是性能又有所提升。
原来是:
char[] -> String -> Long.parseLong(String)
现在优化为Lexer.parseLong(char[]),把Long.parseLong的代码拿过来,直接放到Lexer中,这个改动的结果是性能又有所提升。
84 楼
ouchxp
2010-12-22
windlike 写道
要那么快有个鸟用
"鸟"的用处可大了!!! 你懂的~~~
83 楼
suyulin6688
2010-12-22
楼主强悍。
为了保险和稳定,我还是继续用 jackson 的 json处理库,已经够快了,并且是 spring 3 mvc 推荐和依赖的 库。
为了保险和稳定,我还是继续用 jackson 的 json处理库,已经够快了,并且是 spring 3 mvc 推荐和依赖的 库。
82 楼
waitingmyself
2010-12-22
8210 写道
wenshao 写道
sdh5724 写道
毛人温少, 你不吹牛要死人啊。 等我下去看看代码, 要是被我发现有改进的余地, 我要让你这儿跪上三天三夜, 向人民谢罪~
就在/ali_platform/incubator/fast-json/trunk下,尽管看!!!
/ali_platform/incubator/fast-json/trunk这是相对地址啊,如何访问啊
这个回复有点意思
81 楼
javamonkey
2010-12-22
LZ这次搞不好,影响个人是小,但影响你所在的公司事大啊
80 楼
wenshao
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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就行了么?
非数字字符会导致数组越界访问错误
79 楼
wenshao
2010-12-22
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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),也是因为性能吗?
正确,那个性能很差的!
78 楼
superwwt
2010-12-22
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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就行了么?
77 楼
sky3380
2010-12-22
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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),也是因为性能吗?
76 楼
wenshao
2010-12-22
谢谢校长进行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搞鬼了。
这次调整之后,性能又提升了几个百分点。
最终采用的实现如下,很简单的:
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搞鬼了。
这次调整之后,性能又提升了几个百分点。
相关推荐
6: v8::internal::Handle<v8::internal::String> v8::internal::JsonParser<false>::SlowScanJsonString<v8::internal::SeqTwoByteString, unsigned short>(v8::internal::Handle<v8::internal::String>, int, int)...
JSONParser是Java编程语言中用于解析JSON(JavaScript Object Notation)数据的一种工具。JSON是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于语言的文本格式,易于人阅读和编写,同时也...
json解析的示例
"JsonParser_java"项目就是一个基于纯Java实现的JSON解析器,适用于Eclipse开发环境。 这个项目的核心目标是提供一个轻量级的解决方案,让用户能够理解和控制JSON解析过程。在Java中,这通常涉及读取JSON字符串,将...
Kotlin-杰森·帕瑟(Kotlin-JsonParser) Kotlin-JsonParser是用于JSON解析的Kotlin库。 它可以将JSON字符串解析为Kotlin Object或以一种简单的方式反向。... implementation 'com.tomatobean:jsonparser:1.0.
对于`JSONParser`这个项目,`license.txt`可能指定了该代码的许可协议,例如MIT、Apache 2.0或者GPL等。这些协议规定了代码的使用、修改和分发的规则,确保了开源软件的合规使用。 在实际应用中,理解JSONParser的...
在Go语言中,标准库`encoding/json`提供了JSON的解析和编码功能,但本项目buger/jsonparser作为替代方案,旨在提供更快的性能,这对于处理大量JSON数据的程序尤其重要。 JSON(JavaScript Object Notation)是一种...
- JSON-P (JSR 353) 和 JSON-B (JSR 374):Java EE标准,提供了API进行JSON处理。 2. JSON解析的基本步骤: - 创建JSON对象或数组:根据JSON字符串,使用解析器创建相应的JSONObject或JSONArray对象。 - 读取...
JSON转化工具类 JSONParser ,iOS数据转化组件 (JSONParser),支持JSON字符串、模型、字典、模型数组、字典数组之间...
JsonParser Json parsing tool can flexibly configure Import add to build.gradle,${latest.version} is dependencies { compile 'com.blakequ.parser:parser:${latest.version}' } maven ...
JSON解析器在 Java 对象上使用 Gson (toJson / fromJson) 展示了 Gson 库的简单使用,将 Java 对象转换为 JSON 格式,反之亦然; 将 JSON 字符串转换为 Java 对象。
JSONParser-master_...这个压缩包可能包含了实现这些功能的源代码,具体细节需要解压后查看代码来深入理解。如果你需要开发基于WebSocket的实时应用,并且涉及到JSON数据的交换,这个源码将是一个很好的学习资源。
9. **面向对象编程**:这个程序很可能采用了面向对象的设计模式,将不同的功能封装到不同的类中,如`JsonParser`用于解析JSON,`SrtGenerator`用于生成SRT,这样可以使代码更清晰、可维护性更强。 10. **软件工程...
结合JSONParser和WebSocket,这个项目可能提供了一个解决方案,用于通过WebSocket实时传输和解析JSON数据。例如,服务器可以发送JSON格式的消息,客户端接收到消息后,使用JSONParser解析成对象,然后进行相应的业务...
- `JSONParser` 类:虽然名为`JSONParser`,但这个库实际上并没有提供一个单独的解析器类。解析JSON通常通过`JSONObject`或`JSONArray`的构造函数完成,它们可以接受一个字符串参数并自动解析。 2. **...
这个库可能是一个开源项目,用于帮助开发者高效地解析和生成JSON格式的数据。 JSON格式本身具有易读性,它由键值对组成,键用引号括起来,值可以是字符串、数字、布尔值、数组、对象或者null。在C++中,解析JSON...
利用java反射机制实现的json与java对象互相转化的工具,只暴露了两个空开的接口,其他接口都是私有的。
Python的内置`json`模块提供了基本的JSON编码和解码功能,但`jsonparser`可能提供额外的特性或优化,例如更快的解析速度、更丰富的错误处理机制或者支持特定的JSON扩展。 **安装与使用** 要安装`jsonparser`,首先...