当前位置: 首页 > news >正文

佛山网站建设推广服务建设网站虚拟现实技术

佛山网站建设推广服务,建设网站虚拟现实技术,常见的网络推广方式有哪些,花钱做网站注意在实际的项目开发中#xff0c;对象间赋值普遍存在#xff0c;随着双十一、秒杀等电商过程愈加复杂#xff0c;数据量也在不断攀升#xff0c;效率问题#xff0c;浮出水面。 问#xff1a;如果是你来写对象间赋值的代码#xff0c;你会怎么做#xff1f; 答#xf…在实际的项目开发中对象间赋值普遍存在随着双十一、秒杀等电商过程愈加复杂数据量也在不断攀升效率问题浮出水面。 问如果是你来写对象间赋值的代码你会怎么做 答想都不用想直接代码走起来get、set即可。 问下图这样 答对啊你怎么能把我的代码放到网上 问没我只是举个例子 答这涉及到商业机密是很严重的问题 问我发现你挺能扯皮啊直接回答问题行吗 答OKOK我也觉得这样写很low上次这么写之后差点挨打 对象太多ctrl c strl v键盘差点没敲坏而且很容易出错一不留神属性没对应上赋错值了代码看起来很傻缺一个类好几千行全是get、set复制还起个了自以为很优雅的名字transfer如果属性名不能见名知意还得加上每个属性的含义注释基本这种赋值操作都是要加的注释很重要注释很重要注释很重要代码维护起来很麻烦如果对象过多会产生类爆炸问题如果属性过多会严重违背阿里巴巴代码规约一个方法的实际代码最多20行 问行了行了说说怎么解决吧。 答很简单啊可以通过工具类Beanutils直接赋值啊 问我听说工具类最近很卷你用的哪个啊 答就Apache自带的那个啊贼简单。我手写一个给你欣赏一下。 问你这代码报错啊避免用Apache Beanutils进行属性的copy。 答没报错只是严重警告而已代码能跑就行有问题再优化呗 问你这什么态度人事在哪划拉的人为啥会出现严重警告 答拿多少钱干多少活我又不是XXX应该是性能问题吧 问具体什么原因导致的呢 答3000块钱还得手撕一下 apache copyProperties的源代码呗 通过单例模式调用copyProperties但是每一个方法对应一个BeanUtilsBean.getInstance()实例每一个类实例对应一个实例这不算一个真正的单例模式。 public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {BeanUtilsBean.getInstance().copyProperties(dest, orig); }性能瓶颈 -- 日志太多也是病 通过源码可以看到每一个copyProperties都要进行多次类型检查还要打印日志。 /*** org.apache.commons.beanutils.BeanUtils.copyProperties方法源码解析* author 哪吒编程* time 2023-01-07*/ public void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {// 类型检查if (dest null) {throw new IllegalArgumentException(No destination bean specified);} else if (orig null) {throw new IllegalArgumentException(No origin bean specified);} else {// 打印日志if (this.log.isDebugEnabled()) {this.log.debug(BeanUtils.copyProperties( dest , orig ));}int var5;int var6;String name;Object value;// 类型检查// DanyBean 提供了可以动态修改实现他的类的属性名称、属性值、属性类型的功能if (orig instanceof DynaBean) {// 获取源对象所有属性DynaProperty[] origDescriptors ((DynaBean)orig).getDynaClass().getDynaProperties();DynaProperty[] var4 origDescriptors;var5 origDescriptors.length;for(var6 0; var6 var5; var6) {DynaProperty origDescriptor var4[var6];// 获取源对象属性名name origDescriptor.getName();// 判断源对象是否可读、判断目标对象是否可写if (this.getPropertyUtils().isReadable(orig, name) this.getPropertyUtils().isWriteable(dest, name)) {// 获取对应的值value ((DynaBean)orig).get(name);// 每个属性都调用一次copyPropertythis.copyProperty(dest, name, value);}}} else if (orig instanceof Map) {MapString, Object propMap (Map)orig;Iterator var13 propMap.entrySet().iterator();while(var13.hasNext()) {Map.EntryString, Object entry (Map.Entry)var13.next();String name (String)entry.getKey();if (this.getPropertyUtils().isWriteable(dest, name)) {this.copyProperty(dest, name, entry.getValue());}}} else {PropertyDescriptor[] origDescriptors this.getPropertyUtils().getPropertyDescriptors(orig);PropertyDescriptor[] var14 origDescriptors;var5 origDescriptors.length;for(var6 0; var6 var5; var6) {PropertyDescriptor origDescriptor var14[var6];name origDescriptor.getName();if (!class.equals(name) this.getPropertyUtils().isReadable(orig, name) this.getPropertyUtils().isWriteable(dest, name)) {try {value this.getPropertyUtils().getSimpleProperty(orig, name);this.copyProperty(dest, name, value);} catch (NoSuchMethodException var10) {}}}}} }通过 jvisualvm.exe 检测代码性能 再通过jvisualvm.exe检测一下运行情况果然logging.log4j赫然在列稳居耗时Top1。 问还有其它好的方式吗性能好一点的 答当然有据我了解有 4 种工具类实际上可能会有更多话不多说先简单介绍一下。 org.apache.commons.beanutils.BeanUtils;org.apache.commons.beanutils.PropertyUtils;org.springframework.cglib.beans.BeanCopier;org.springframework.beans.BeanUtils 问那你怎么不用 答OK我来演示一下 package com.nezha.copy;import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; import org.springframework.cglib.beans.BeanCopier; import org.springframework.util.StopWatch;public class Test {public static void main(String[] args) {User user new User();user.setUserId(1);user.setUserName(哪吒编程);user.setCardId(123);user.setCreateTime(2023-01-03);user.setEmail(666666666qq.com);user.setOperate(哪吒);user.setOrgId(46987916);user.setPassword(123456);user.setPhone(10086);user.setRemark(456);user.setSex(1);user.setStatus(1);user.setTel(110);user.setType(0);user.setUpdateTime(2023-01-05);User target new User();int sum 10000000;apacheBeanUtilsCopyTest(user,target,sum);commonsPropertyCopyTest(user,target,sum);cglibBeanCopyTest(user,target,sum);springBeanCopyTest(user,target,sum);}private static void apacheBeanUtilsCopyTest(User source, User target, int sum) {StopWatch stopWatch new StopWatch();stopWatch.start();for (int i 0; i sum; i) {apacheBeanUtilsCopy(source,target);}stopWatch.stop();System.out.println(使用org.apache.commons.beanutils.BeanUtils方式赋值sum个user对象耗时stopWatch.getLastTaskTimeMillis()毫秒);}/*** org.apache.commons.beanutils.BeanUtils方式*/private static void apacheBeanUtilsCopy(User source, User target) {try {BeanUtils.copyProperties(source, target);} catch (Exception e) {}}private static void commonsPropertyCopyTest(User source, User target, int sum) {StopWatch stopWatch new StopWatch();stopWatch.start();for (int i 0; i sum; i) {commonsPropertyCopy(source,target);}stopWatch.stop();System.out.println(使用org.apache.commons.beanutils.PropertyUtils方式赋值sum个user对象耗时stopWatch.getLastTaskTimeMillis()毫秒);}/*** org.apache.commons.beanutils.PropertyUtils方式*/private static void commonsPropertyCopy(User source, User target) {try {PropertyUtils.copyProperties(target, source);} catch (Exception e) {}}private static void cglibBeanCopyTest(User source, User target, int sum) {StopWatch stopWatch new StopWatch();stopWatch.start();for (int i 0; i sum; i) {cglibBeanCopy(source,target);}stopWatch.stop();System.out.println(使用org.springframework.cglib.beans.BeanCopier方式赋值sum个user对象耗时stopWatch.getLastTaskTimeMillis()毫秒);}/*** org.springframework.cglib.beans.BeanCopier方式*/static BeanCopier copier BeanCopier.create(User.class, User.class, false);private static void cglibBeanCopy(User source, User target) {copier.copy(source, target, null);}private static void springBeanCopyTest(User source, User target, int sum) {StopWatch stopWatch new StopWatch();stopWatch.start();for (int i 0; i sum; i) {springBeanCopy(source,target);}stopWatch.stop();System.out.println(使用org.springframework.beans.BeanUtils.copyProperties方式赋值sum个user对象耗时stopWatch.getLastTaskTimeMillis()毫秒);}/*** org.springframework.beans.BeanUtils.copyProperties方式*/private static void springBeanCopy(User source, User target) {org.springframework.beans.BeanUtils.copyProperties(source, target);} }“四大金刚” 性能统计 方法1000100001000001000000apache BeanUtils906毫秒807毫秒1892毫秒11049毫秒apache PropertyUtils17毫秒96毫秒648毫秒5896毫秒spring cglib BeanCopier0毫秒1毫秒3毫秒10毫秒spring copyProperties87毫秒90毫秒123毫秒482毫秒 不测不知道一测吓一跳差的还真的多。 spring cglib BeanCopier性能最好apache BeanUtils性能最差。 性能走势 -- spring cglib BeanCopier优于 spring copyProperties优于 apache PropertyUtils优于 apache BeanUtils 避免用Apache Beanutils进行属性的copy的问题 上面分析完了下面再看看其它的方法做了哪些优化。 Apache PropertyUtils 源码分析 从源码可以清晰的看到类型检查变成了非空校验去掉了每一次copy的日志记录性能肯定更好了。 类型检查变成了非空校验去掉了每一次copy的日志记录实际赋值的地方由copyProperty变成了DanyBean setSimpleProperty DanyBean 提供了可以动态修改实现他的类的属性名称、属性值、属性类型的功能。 /*** org.apache.commons.beanutils.PropertyUtils方式源码解析* author 哪吒编程* time 2023-01-07*/ public void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {// 判断数据源和目标对象不是nullif (dest null) {throw new IllegalArgumentException(No destination bean specified);} else if (orig null) {throw new IllegalArgumentException(No origin bean specified);} else {// 删除了org.apache.commons.beanutils.BeanUtils.copyProperties中最为耗时的log日志记录int var5;int var6;String name;Object value;// 类型检查if (orig instanceof DynaBean) {// 获取源对象所有属性DynaProperty[] origDescriptors ((DynaBean)orig).getDynaClass().getDynaProperties();DynaProperty[] var4 origDescriptors;var5 origDescriptors.length;for(var6 0; var6 var5; var6) {DynaProperty origDescriptor var4[var6];// 获取源对象属性名name origDescriptor.getName();// 判断源对象是否可读、判断目标对象是否可写if (this.isReadable(orig, name) this.isWriteable(dest, name)) {try {// 获取对应的值value ((DynaBean)orig).get(name);// 相对于org.apache.commons.beanutils.BeanUtils.copyProperties此处有优化// DanyBean 提供了可以动态修改实现他的类的属性名称、属性值、属性类型的功能if (dest instanceof DynaBean) {((DynaBean)dest).set(name, value);} else {// 每个属性都调用一次copyPropertythis.setSimpleProperty(dest, name, value);}} catch (NoSuchMethodException var12) {if (this.log.isDebugEnabled()) {this.log.debug(Error writing to name on class dest.getClass() , var12);}}}}} else if (orig instanceof Map) {Iterator entries ((Map)orig).entrySet().iterator();while(true) {Map.Entry entry;String name;do {if (!entries.hasNext()) {return;}entry (Map.Entry)entries.next();name (String)entry.getKey();} while(!this.isWriteable(dest, name));try {if (dest instanceof DynaBean) {((DynaBean)dest).set(name, entry.getValue());} else {this.setSimpleProperty(dest, name, entry.getValue());}} catch (NoSuchMethodException var11) {if (this.log.isDebugEnabled()) {this.log.debug(Error writing to name on class dest.getClass() , var11);}}}} else {PropertyDescriptor[] origDescriptors this.getPropertyDescriptors(orig);PropertyDescriptor[] var16 origDescriptors;var5 origDescriptors.length;for(var6 0; var6 var5; var6) {PropertyDescriptor origDescriptor var16[var6];name origDescriptor.getName();if (this.isReadable(orig, name) this.isWriteable(dest, name)) {try {value this.getSimpleProperty(orig, name);if (dest instanceof DynaBean) {((DynaBean)dest).set(name, value);} else {this.setSimpleProperty(dest, name, value);}} catch (NoSuchMethodException var10) {if (this.log.isDebugEnabled()) {this.log.debug(Error writing to name on class dest.getClass() , var10);}}}}}} }通过 jvisualvm.exe 检测代码性能 再通过jvisualvm.exe检测一下运行情况果然logging.log4j没有了其他的基本不变。 Spring copyProperties 源码分析 判断数据源和目标对象的非空判断改为了断言每次copy没有日志记录没有if (orig instanceof DynaBean) {这个类型检查增加了放开权限的步骤 /*** org.springframework.beans.BeanUtils.copyProperties方法源码解析* author 哪吒编程* time 2023-01-07*/ private static void copyProperties(Object source, Object target, Nullable Class? editable,Nullable String... ignoreProperties) throws BeansException {// 判断数据源和目标对象不是nullAssert.notNull(source, Source must not be null);Assert.notNull(target, Target must not be null);/*** 若target设置了泛型则默认使用泛型* 若是 editable 是 null则此处忽略* 一般情况下editable都默认为null*/Class? actualEditable target.getClass();if (editable ! null) {if (!editable.isInstance(target)) {throw new IllegalArgumentException(Target class [ target.getClass().getName() ] not assignable to Editable class [ editable.getName() ]);}actualEditable editable;}// 获取target中全部的属性描述PropertyDescriptor[] targetPds getPropertyDescriptors(actualEditable);// 需要忽略的属性ListString ignoreList (ignoreProperties ! null ? Arrays.asList(ignoreProperties) : null);for (PropertyDescriptor targetPd : targetPds) {Method writeMethod targetPd.getWriteMethod();// 目标对象存在写入方法、属性不被忽略if (writeMethod ! null (ignoreList null || !ignoreList.contains(targetPd.getName()))) {PropertyDescriptor sourcePd getPropertyDescriptor(source.getClass(), targetPd.getName());if (sourcePd ! null) {Method readMethod sourcePd.getReadMethod();/*** 源对象存在读取方法、数据是可复制的* writeMethod.getParameterTypes()[0]获取 writeMethod 的第一个入参类型* readMethod.getReturnType()获取 readMethod 的返回值类型* 判断返回值类型和入参类型是否存在继承关系只有是继承关系或相等的情况下才会进行注入*/if (readMethod ! null ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {try {// 放开读取方法的权限if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {readMethod.setAccessible(true);}// 通过反射获取值Object value readMethod.invoke(source);// 放开写入方法的权限if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {writeMethod.setAccessible(true);}// 通过反射写入值writeMethod.invoke(target, value);}catch (Throwable ex) {throw new FatalBeanException(Could not copy property targetPd.getName() from source to target, ex);}}}}} }总结 阿里的友情提示避免用Apache Beanutils进行对象的copy还是很有道理的。 Apache Beanutils的性能问题出现在类型校验和每一次copy的日志记录 Apache PropertyUtils 进行了如下优化 类型检查变成了非空校验去掉了每一次copy的日志记录实际赋值的地方由copyProperty变成了DanyBean setSimpleProperty Spring copyProperties 进行了如下优化 判断数据源和目标对象的非空判断改为了断言每次copy没有日志记录没有if (orig instanceof DynaBean) {这个类型检查增加了放开权限的步骤 Java学习路线总结搬砖工逆袭Java架构师 10万字208道Java经典面试题总结(附答案) Java基础教程系列 Java基础教程系列进阶篇
文章转载自:
http://www.morning.qkxt.cn.gov.cn.qkxt.cn
http://www.morning.pmmrb.cn.gov.cn.pmmrb.cn
http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn
http://www.morning.dpzcc.cn.gov.cn.dpzcc.cn
http://www.morning.trrhj.cn.gov.cn.trrhj.cn
http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn
http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn
http://www.morning.jbctp.cn.gov.cn.jbctp.cn
http://www.morning.prgdy.cn.gov.cn.prgdy.cn
http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn
http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn
http://www.morning.khyqt.cn.gov.cn.khyqt.cn
http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn
http://www.morning.xckrj.cn.gov.cn.xckrj.cn
http://www.morning.xbptx.cn.gov.cn.xbptx.cn
http://www.morning.rhsg.cn.gov.cn.rhsg.cn
http://www.morning.kehejia.com.gov.cn.kehejia.com
http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn
http://www.morning.tdhxp.cn.gov.cn.tdhxp.cn
http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn
http://www.morning.njpny.cn.gov.cn.njpny.cn
http://www.morning.rmtxp.cn.gov.cn.rmtxp.cn
http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn
http://www.morning.fndmk.cn.gov.cn.fndmk.cn
http://www.morning.nkpls.cn.gov.cn.nkpls.cn
http://www.morning.rmryl.cn.gov.cn.rmryl.cn
http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn
http://www.morning.zqbrw.cn.gov.cn.zqbrw.cn
http://www.morning.ylmxs.cn.gov.cn.ylmxs.cn
http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn
http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn
http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn
http://www.morning.ymmjx.cn.gov.cn.ymmjx.cn
http://www.morning.nmngg.cn.gov.cn.nmngg.cn
http://www.morning.tzpqc.cn.gov.cn.tzpqc.cn
http://www.morning.brrxz.cn.gov.cn.brrxz.cn
http://www.morning.plqkz.cn.gov.cn.plqkz.cn
http://www.morning.c7627.cn.gov.cn.c7627.cn
http://www.morning.crdtx.cn.gov.cn.crdtx.cn
http://www.morning.spkw.cn.gov.cn.spkw.cn
http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn
http://www.morning.qwhbk.cn.gov.cn.qwhbk.cn
http://www.morning.rytps.cn.gov.cn.rytps.cn
http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn
http://www.morning.srgsb.cn.gov.cn.srgsb.cn
http://www.morning.prgnp.cn.gov.cn.prgnp.cn
http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn
http://www.morning.thrtt.cn.gov.cn.thrtt.cn
http://www.morning.rnfn.cn.gov.cn.rnfn.cn
http://www.morning.bmssj.cn.gov.cn.bmssj.cn
http://www.morning.ygkq.cn.gov.cn.ygkq.cn
http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn
http://www.morning.jthjr.cn.gov.cn.jthjr.cn
http://www.morning.rnqyy.cn.gov.cn.rnqyy.cn
http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn
http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn
http://www.morning.ntnml.cn.gov.cn.ntnml.cn
http://www.morning.lsnbx.cn.gov.cn.lsnbx.cn
http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn
http://www.morning.wbrf.cn.gov.cn.wbrf.cn
http://www.morning.stxg.cn.gov.cn.stxg.cn
http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn
http://www.morning.bjndc.com.gov.cn.bjndc.com
http://www.morning.qbmpb.cn.gov.cn.qbmpb.cn
http://www.morning.cxlys.cn.gov.cn.cxlys.cn
http://www.morning.njhyk.cn.gov.cn.njhyk.cn
http://www.morning.skrww.cn.gov.cn.skrww.cn
http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn
http://www.morning.mmjqk.cn.gov.cn.mmjqk.cn
http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn
http://www.morning.qhnmj.cn.gov.cn.qhnmj.cn
http://www.morning.ljzss.cn.gov.cn.ljzss.cn
http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn
http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn
http://www.morning.fhykt.cn.gov.cn.fhykt.cn
http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn
http://www.morning.trnl.cn.gov.cn.trnl.cn
http://www.morning.yrblz.cn.gov.cn.yrblz.cn
http://www.morning.zbjfq.cn.gov.cn.zbjfq.cn
http://www.morning.zwndt.cn.gov.cn.zwndt.cn
http://www.tj-hxxt.cn/news/222719.html

相关文章:

  • 南昌电商购物网站开发做视频网站带宽要求
  • 如何做优化网站排alexa优化衡水网站公司
  • 短视频网站php源码免费wordpress模板调用数据
  • 建设通网站首页wordpress调取多个分类文章
  • 购物网站有哪些简约风格装修
  • 全能网站建设完全自学如何自己建网站服务器
  • 仿制网站建设thinkphp网站开发实例教程
  • 南充做网站公司荆门网站建设电话
  • 抖音上做我女朋友网站最火的主题wordpress
  • 厦门大型网站设计公司jquery网站开发平台
  • 二手房地产中介网站建设wap网站模板
  • 郑州做网站熊掌号超市网站开发建设建议
  • 计算机网络技术毕业设计选题宁波seo外包优化
  • 上海哪个网站好用河北建设广州分公司网站
  • 专门做游轮的网站万网
  • 企业商城网站建设方案中国空间站对接成功
  • 免费的行情软件app网站win7系统优化大师
  • 做泌尿科网站价格可以建设一个网站
  • 展厅设计找哪家公司好seo百度关键词排名
  • 最超值的郑州网站建设静态网页代码大全
  • 如何编程建设网站自己请问我做吉利网站吉利啊
  • 建设网站教程视频视频团队拓展总结
  • 宿迁做网站 宿迁网站建设芜湖市建设银行支行网站
  • 网站建设试题卷qt做网站
  • 优秀国外网站设计赏析代理网站开发
  • 店铺网站怎么建网页制作基础教程第2版答案
  • 搜索引擎是网站提供的搜索服务吗制作网页软件教程
  • 什么网站合适做流量大庆+网站建设
  • 成都大型网站建设网站建设服务英文
  • 苏州产品网站建设重庆模板建站软件