[QUESTION] 为什么这么慢呢 string 反序列化成java对象 要一秒钟
请描述您的问题
询问有关本项目的使用和其他方面的相关问题。
`package com.easyis.apaas.common.form.menu; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader;
/**
- 研究 从redis 读取 CustomMenuEntity太慢
*/ public class TestFastjson2ParseSlow { static { /System.out.println("执行了"+JSONReader.Feature.AllowUnQuotedFieldNames.mask); JSON.config(JSONReader.Feature.AllowUnQuotedFieldNames);/ }
public static void toJSONObject(String str) {
long begin =System.currentTimeMillis();
//转jsonObj
Object v = JSON.parseObject(str);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJSONObject耗时:"+cost);
}
public static void toJavaObjectAutoType(String str) {
long begin =System.currentTimeMillis();
//转jsonObj
@SuppressWarnings("deprecation")
Object v = JSON.parseObject(str, Object.class,JSONReader.Feature.SupportAutoType);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJavaObjectAutoType耗时:"+cost);
}
public static void toJavaObject(String str,Class<?> clazz) {
long begin =System.currentTimeMillis();
//转jsonObj
//会报错 can not convert to boolean : java.util.HashMap
//Object v = JSON.parseObject(str, clazz);
Object jsonObj = JSON.parse(str);
Object v = JSON.to(clazz, jsonObj);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJavaObject耗时:"+cost);
}
public static void main(String[] args) throws Exception {
//JSON.config(JSONReader.Feature.AllowUnQuotedFieldNames);
String str="{\"@type\":\"com.easyis.apaas.common.form.menu.CustomMenuEntity\",\"appId\":\"sapp_dev_platform\",\"bottomOperationButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"exportApp\\\",\\\"functionCnName\\\":\\\"导出应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n\\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"single\\\\\\\",\\\\n \\\\n \\\\\\\"actionType\\\\\\\":\\\\\\\"download\\\\\\\",\\\\n \\\\n \\\\\\\"refreshList\\\\\\\":false,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.exportApp\\\\\\\"\\\\n\\\\n}\\\\n\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"importApp\\\",\\\"functionCnName\\\":\\\"导入应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n\\\\n \\\\\\\"formKey\\\\\\\":\\\\\\\"st_ide_import_export_file\\\\\\\",\\\\n \\\\\\\"formData\\\\\\\":{},\\\\n \\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"none\\\\\\\",\\\\n \\\\n \\\\\\\"refreshList\\\\\\\":true,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.importApp\\\\\\\"\\\\n\\\\n}\\\\n\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchDisabled\\\",\\\"functionCnName\\\":\\\"批量停用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchEnabled\\\",\\\"functionCnName\\\":\\\"批量启用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"0\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchRecycle\\\",\\\"functionCnName\\\":\\\"批量移动到回收站\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"-1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"}]\",\"createBy\":\"admin\",\"createTime\":\"2024-05-16 17:10:56\",\"customMenuId\":\"1791033582962081792\",\"ds\":\"st_ide_app\",\"keywordQueryFieldsBean\":[{\"camleFieldName\":\"name\",\"field_des_name\":\"null【常规】\",\"field_name\":\"name\",\"field_type\":\"常规\",\"numType\":false,\"orderby\":0}],\"menuCode\":\"sm_1_2\",\"menuIcon\":\"menu-icon fa fa-leaf black\",\"menuName\":\"应用\",\"menuOrder\":\"460\",\"menuType\":1,\"operationButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"switchApp\\\",\\\"functionCnName\\\":\\\"切换应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n \\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"single\\\\\\\",\\\\n\\\\n \\\\\\\"refreshList\\\\\\\":true,\\\\n \\\\\\\"refreshListTimeout\\\\\\\":0,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.switchApp\\\\\\\"\\\\n\\\\n}\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"disabled\\\",\\\"functionCnName\\\":\\\"停用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"enabled\\\",\\\"functionCnName\\\":\\\"启用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"0\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"recycle\\\",\\\"functionCnName\\\":\\\"移动到回收站\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"-1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"}]\",\"orderFields\":[{\"@type\":\"com.alibaba.fastjson2.JSONObject\",\"field_name\":\"app_id\",\"order\":\"DESC\"}],\"orderbyFieldsBean\":[{\"field\":{\"camleFieldName\":\"appId\",\"field_des_name\":\"null【常规】\",\"field_name\":\"app_id\",\"field_type\":\"常规\",\"numType\":false,\"orderby\":0},\"orderByOrder\":\"DESC\"}],\"pageBtnsEnabledMap\":{\"@type\":\"java.util.HashMap\",\"add\":true,\"batchDel\":true,\"edit\":true,\"del\":true,\"list\":true},\"pageButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"list\\\",\\\"functionCnName\\\":\\\"查询\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"add\\\",\\\"functionCnName\\\":\\\"添加\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"edit\\\",\\\"functionCnName\\\":\\\"修改\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_4\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"del\\\",\\\"functionCnName\\\":\\\"删除\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_3\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchDel\\\",\\\"functionCnName\\\":\\\"删批量除\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_3\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"batchEdit\\\",\\\"functionCnName\\\":\\\"批量编辑\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"importData\\\",\\\"functionCnName\\\":\\\"导入\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"exportData\\\",\\\"functionCnName\\\":\\\"导出\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"}]\",\"pageButtonEntity\":[{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"查询\",\"functionName\":\"list\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"新增\",\"functionName\":\"add\",\"position\":\"top\"},{\"condition\":\"TV_4\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"修改\",\"functionName\":\"edit\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"删除\",\"functionName\":\"del\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"批量删除\",\"functionName\":\"batchDel\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"批量编辑\",\"functionName\":\"batchEdit\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导入\",\"functionName\":\"importData\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导出\",\"functionName\":\"exportData\",\"position\":\"top\"}],\"pageButtonEntityCach\":[{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"查询\",\"functionName\":\"list\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"新增\",\"functionName\":\"add\",\"position\":\"top\"},{\"condition\":\"TV_4\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"修改\",\"functionName\":\"edit\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"删除\",\"functionName\":\"del\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"批量删除\",\"functionName\":\"batchDel\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"批量编辑\",\"functionName\":\"batchEdit\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导入\",\"functionName\":\"importData\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导出\",\"functionName\":\"exportData\",\"position\":\"top\"}],\"pageCode\":\"sm_1_2\",\"pageQuerySet\":{\"keyword_query\":\"name\",\"simple_query\":[{\"@type\":\"com.alibaba.fastjson2.JSONObject\",\"field_name\":\"status\",\"operation\":\"=\",\"isBetweenAnd\":false}]},\"quickTagViews\":\"\",\"reportId\":\"\",\"showFieldsBean\":[],\"sysMenuType\":\"3\",\"tabViews\":\"TV_4:全部,TV_3:回收站\",\"tableId\":\"st_ide_app\",\"tenantId\":\"0:sapp_dev_platform\",\"updateBy\":\"admin\",\"updateTime\":\"2024-08-27 02:27:58\"}\r\n";
//转jsonObj 574 627 693 605
//toJSONObject(str);
//转java对象指定class 1050 969 966
for (int i = 0; i < 10; i++) {
new Thread() {
@Override
public void run() {
toJavaObject(str,com.easyis.apaas.common.form.menu.CustomMenuEntity.class);
}
}.start();
}
// 转java对象 935 936 1023 973
//toJavaObjectAutoType(str);
}
}`
toJSONObject耗时也要半秒
fastjson2 v2.0.59
这样都要500毫秒....,不是号称速度快吗
String str="{\"createBy\":\"admin\"}"; long begin =System.currentTimeMillis(); Object v = JSON.parseObject(str); long end =System.currentTimeMillis();
似乎是有初始化操作,导致的 如果在执行JSON.parseObject转换前,随便执行个什么操作触发初始化: JSON.parse("{}"); 或者JSON.config(JSONReader.Feature.DisableReferenceDetect); 或者 arr.toJSONString(); ,后面执行时间就会减少,但是初始化也要时间总体时间还是没变
所以 向下面这样 最简单的parseObject也需要半秒,目前无解,虽然后面再执行多次转换时间趋向于0,但是第一次时间就是要这么久暂时无解, 有什么办法呢,转jsonObject半秒再转java对象半秒 就要一秒钟了,太慢了 有没有解决方法?
long a = System.currentTimeMillis(); JSONObject json = JSON.parseObject("{\"name\":\"x\"}"); long b = System.currentTimeMillis(); System.out.println(b - a);
似乎是有初始化操作,导致的 如果在执行JSON.parseObject转换前,随便执行个什么操作触发初始化: JSON.parse("{}"); 或者JSON.config(JSONReader.Feature.DisableReferenceDetect); 或者 arr.toJSONString(); ,后面执行时间就会减少,但是初始化也要时间总体时间还是没变
所以 向下面这样 最简单的parseObject也需要半秒,目前无解,虽然后面再执行多次转换时间趋向于0,但是第一次时间就是要这么久暂时无解, 有什么办法呢,转jsonObject半秒再转java对象半秒 就要一秒钟了,太慢了 有没有解决方法?
long a = System.currentTimeMillis(); JSONObject json = JSON.parseObject("{\"name\":\"x\"}"); long b = System.currentTimeMillis(); System.out.println(b - a);
和环境有很大关系,我这边 jdk8、jdk17 测试都是 180ms 左右
下面是在命令行执行都是200-300ms ,相比在eclipse里执行快一点,eclipse 里执行 要500ms 不知道为啥
我这边jdk 1.8 JSON.parseObject("{"name":"x"}"); 大概 280到360ms
jdk-10.0.2 快一点 大概200-220ms
jdk-21.0.4 220-240ms
jdk-22.0.2 200-300ms
jdk-23 也是差不多 200到300ms
graalvm-jdk-23+37.1 也是200到300ms
可以试试在一次测试里循环执行多次?这样就不存在初始化导致的误差了吧。
// 可以试试这个计时
long timeStart = System.nanoTime();
System.out.println((System.nanoTime() - timeStart) / 1e6D + "ms");