【导读】实际项目开发中、有部分童鞋可能无时无刻都在关注性能,那么我们到底应该什么时候关注性能呢?

个人以为,性能并非一次性就可完全成全,需结合实际业务有一个大致评估或预期,比如数据量大小,若预期短暂并不会达到性能瓶颈,大可不必过度考虑,又或者根据自我假想可能存在性能问题,于是大张旗鼓陷入自我意识流,最终可能结果吃亏反而不讨好

项目性能考虑

此前我个人写过一版Excel导入和导出,并未使用对应开源组件,因为导出和导入逻辑并不复杂,不涉及单元格拆分、包含图片、下拉框等等,但处理起来也并没有什么难度,借助NPOI或EPPLUS工具皆可满足

于是我尝试将此前封装Excel导入和导出做了进一步重构处理,主要为解决此前遗留问题:

其一:表头列和实体属性列顺序必须一一对应

其二:导出由于Excel单个Sheet行有限制,超出一定行,必须重建Sheet

其三:大量使用反射,若存在多个Sheet,且每个Sheet行数量稍微巨大,则存在一定性能瓶颈

如上两点可以简单解决,这里我们忽略,问题在于第三点,因为使用泛型,针对每一行读取都会反射对象,同时也要获取其实例属性并赋值,这里我们完全可以改善下性能

接下来,我们通过一个简单例子,来演示如何改善反射性能,当然,也还有其他方案,这里我只介绍我个人的方案

反射性能改善

如一部分开源组件一样,我们通过特性标识属性,属性名称和表头列匹配,顺序无需一致,同样,属性可忽略赋值

基于上述情况,我们要获取对应实体所标识的属性特性,这里为便于后续属性赋值,我们缓存属性相关信息,避免频繁通过反射获取属性信息

接下来,我们来到属性赋值和获取,我们以设置值为例,获取值同理,同时以1万作为基数来验证,然后以此基数递增,如下测试实体

public class Test
{public int Id { get; set; }public string Name { get; set; }
}

反射属性赋值示例,如下:

static void ReflectionExample(int count)
{var stopWatch = new Stopwatch();stopWatch.Start();var tests = Enumerable.Repeat(new Test(), count).ToList();var propertyIdInfo = typeof(Test).GetProperty("Id");var propertyNameInfo = typeof(Test).GetProperty("Name");foreach (var test in tests){propertyIdInfo.SetValue(test, 1);propertyNameInfo.SetValue(test, "jeffcky");}Console.WriteLine($"反射赋值耗时:{stopWatch.ElapsedMilliseconds}ms");
}

当然,根据笔记本配置以及所使用耗时方案不标准,结果会存在差异,但基本可判断反射耗时会有20ms以上

接下来,我使用委托方式来直接调用属性Set方法,看看性能是否会有改善

static void DelegateExample(int count)
{var stopWatch = new Stopwatch();stopWatch.Start();var tests = Enumerable.Repeat(new Test(), count).ToList();var setId = (Action<Test, int>)Delegate.CreateDelegate(typeof(Action<Test, int>), null, typeof(Test).GetProperty("Id").GetSetMethod());var setName = (Action<Test, string>)Delegate.CreateDelegate(typeof(Action<Test, string>), null,typeof(Test).GetProperty("Name").GetSetMethod());foreach (var test in tests){setId(test, 3);setName(test, "jeffcky");}Console.WriteLine($"委托赋值耗时:{stopWatch.ElapsedMilliseconds}ms");
}

接下来,我们对比反射1万条数据属性赋值,看看耗时情况怎样

通过运行多次,通过调用委托赋值其耗时基本可控制在5ms以内,想想差距还是有点大,接下来我们将数据量直接上升到100万看看其差距

结果显而易见,通过反射耗时将超过1s,而委托赋值则控制在几十ms,如果再加上属性的个数和获取属性值,耗时时间势必将会再一次拉大

为何很多人都说反射性能很差,因为引入反射会通过如下几步对性能有巨大损耗

其一:检查所调用方法是否存在

其二:检查其安全性和访问可见性

其三:检查签名,确保所提供的参数和类型的数量与方法定义签名一致

其四:解出参数

此文意非强调不能用反射,网上讨论也很多,还是老话,根据实际业务情况,具体分析,别整体就惦记和揪着性能不放,比如针对快递行业,导入和导出操作可谓再正常不过,其导入数量也是庞大,对于此种情况,我们是否可考虑通过结构体存储数据呢?一切皆通过实际场景出发。

那么问题来了,写本文的目的是什么呢?

???? 时常自我多学习,多思考,多尝试,多积累是否存在更好解决方案,我们都可明显觉察,玩来玩去就那么点语法,为什么别人就能玩出不一样的花样,问题在哪里?

什么时候我们应谈及性能?相关推荐

  1. 解决J2EE系统应用性能问题常用方法

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java专业知识,广州疯狂java培训为你讲解; 性能问题的最明显表现是网页的响 ...

  2. 服务端 I/O 性能大比拼:Node、PHP、Java、Go哪家强?

    理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异.若应用程序比较小,也没有服务于很高的负载,也许它影响甚微.但随着应用程序的负载逐渐上涨,采用错误的I/O模 ...

  3. node和java性能_服务端I/O性能大比拼:Node、PHP、Java和Go(二)

    服务端I/O性能大比拼:Node.PHP.Java和Go(二) 服务端I/O性能大比拼:Node.PHP.Java和Go(二) ### 多线程的方式:Java 所以就在你买了你的第一个域名的时候,Ja ...

  4. go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go

    理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异.若应用程序比较小,也没有服务于很高的负载,也许它影响甚微.但随着应用程序的负载逐渐上涨,采用错误的I/O模 ...

  5. 服务器cpu对游戏的支持,多核服务器性能实测篇―浪潮:服务器cpu玩游戏怎么样...

    至强5500多 核处理器尽管问世只有半年多时间,但目前基于它的服务器产品在市场上已经很常见了,可以说在主流的1-2路服务器新品中都可以看到它的身影.而此间的旗舰机型基本上都定位为2U高度的双路机架式服 ...

  6. 性能测试报告评审规范

    引言 1.1 编写目的 本文档明确性能测试分析报告的评审行为,明确评审过程中使用的各项指标,使性能测试分析报告评审相关人员能够依据此规范检查性能测试分析报告的内容填写是否符合模版要求,检查性能测试分析 ...

  7. 项目性能优化之性能问题分析和压力测试

    项目性能优化之性能问题分析和压力测试 性能问题分析 为什么要性能优化 影响性能的关键要素 性能优化出发点 性能压力测试 什么是压力测试 压力测试的指标 常用压测工具 性能问题分析 为什么要性能优化 应 ...

  8. ssas连接oracle性能,Analysis Services(SSAS) 性能优化

    1.聚合选项中添加聚合,以空间换时间提升性能. 如下图: 性能提升百分比越高,聚合数越高,生成的Cube越大,这就是以空间换时间. 2.修改SSAS服务器上的线程池配置选项.提升并发数. 通过X:\P ...

  9. Oracle SQL 性能优化规范

    SQL 优化总览 1.1.优化中心思想 SQL 优化的中心思想有两点: 1. 少做甚至不做. 少做事情,甚至对不必要的事情干脆不做,自然就能使 SQL 提高效率. 使用索引来减少数据扫描就是少做事思想 ...

最新文章

  1. R语言入门第六集 实验五:综合应用
  2. redis集群搭建(基于docker)
  3. jQuery调用WCF服务传递JSON对象
  4. linux git gui使用教程,跨平台最好用的Git GUI工具gitkraken
  5. 2014\Province_C_C++_A\1 猜年龄
  6. nginx 去掉服务器版本和名称和nginx_status 状态说明
  7. Java对PHP服务器hmac_sha1签名认证方法的匹配实现
  8. 一个月市值蒸发116亿元,《姜子牙》救不了光线传媒
  9. FlexForAndroid:文件读写
  10. 线性回归和逻辑回归的区别_Spark实现线性回归与逻辑回归算法
  11. idea 自动导入包操作及快捷键
  12. android 暗黑模式项目适配过程
  13. selenium操作浏览器
  14. Md5扩展攻击的原理和应用
  15. word2019标题序号显示为黑色小方块-解决办法
  16. linux编辑pdf文件内容,PDF修改文字的步骤
  17. 如何应用font Awesome矢量字体图标介绍
  18. 计算机网络构成的硬件和软件有哪些,计算机的硬件构成及软件构成 有什么
  19. 百度每个月的收录时间
  20. luogu P1710 地铁涨价

热门文章

  1. CentOS5安装Nginx1.4+PHP5.5 FastCGI
  2. Activity的呼叫转移*(3个Activity之间的跳转)
  3. CentOS 6.5 部署WordPress
  4. Java web application——基础
  5. yum 下载RPM包而不进行安装
  6. 使用jquery+css实现瀑布流布局
  7. mysql DDL数据定义语言
  8. UVa 11346 - Probability
  9. 使用Visual Studio 创建新的Web Part项目
  10. jq select操作全集