什么时候我们应谈及性能?

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

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

项目性能考虑

此前我个人写过一版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,如果再加上属性的个数和获取属性值,耗时时间势必将会再一次拉大

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

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

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

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

其四:解出参数

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历

http://blog.csdn.net/dongfengsun/archive/2007/12/12/1930577.aspx 上次用J2SE写了一个文件夹传递工具,把所有文件都以字节流的形式写入到一个*.txt文件里。结果回到家后,光分目录筛选文件就浪费了我整整一个晚上。痛定思痛,决定还是从程序上来解决问题。 那么所有的磁盘文件…

python编写正则表达式匹配单词_Python正则表达式匹配整个单词

守候你守候我 我认为&#xff0c;通过给出的答案&#xff0c;OP所期望的行为并没有完全实现。具体来说&#xff0c;布尔值的期望输出没有完成。给出的答案做帮助说明这一概念&#xff0c;我认为他们是优秀的。也许我可以说明我的意思&#xff0c;我认为OP使用了下面的例子。给出…

python中可以表示任意大的整数_Python无法表示99999999999999999999这样大的整数。

被邓为“小平和国一部意义义的具有际意称赞法律历史&#xff0c;无法”的性的一个具有杰作创造“是是(。表示。对于的容性要密封求高器&#xff0c;样整数包括性试验的要求中应进行气密各种。无法喷涂金属及工具有设备。吊装台起用多重机设备时&#xff0c;表示为(吊装用的常采…

数据写入规则IBufferWriterT

IBufferWriter<T>从名字上看大概已经猜到作用&#xff0c;这个接口是在.NET Standard 2.1作为标准支持。那这个接口的实际使用场和作用是什么&#xff1f;在了解之前先看一下System.Text.Json的一些代码:public sealed class Utf8JsonWriter : IAsyncDisposable, IDispos…

[转]简单介绍如何用Reporting Service制作报表

1&#xff09; 在安装好Reporting Service后&#xff0c;打开Visual studio .net ,选择新建项目&#xff0c;选择建立商业智能项目&#xff0c;选择新建一个报表项目&#xff0c;命名为reportservice1,再选确定&#xff0c;如下图&#xff1a; 2&#xff09;之后&#xff0c;在…

freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

不用说&#xff0c;Spring已经成为Java后端开发的事实上的行业标准。无数公司选择Spring作为基本开发框架。大多数Java后端程序员在日常工作中也会接触到Spring。因此&#xff0c;如何很好地使用Spring&#xff0c;已成为Java程序员的必修课之一。同时&#xff0c;Spring Boot和…

adonis.js mysql_Adonis.js——数据库基本操作

一、配置数据库adonis支持 PostgreSQL&#xff0c;SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;Oracle&#xff0c;MSSQL 数据库&#xff0c;默认为SQLite。在 config/database 中修改配置。connection: Env.get(DB_CONNECTION, mysql),二、创建数据库模型(Model)λ…

C# ObservableCollection和List的区别

一、ObservableCollection和List的区别1&#xff09;ObservableCollection比较简单&#xff0c;继承了Collection, INotifyCollectionChanged, INotifyPropertyChangedCollection&#xff1a;为泛型集合提供基类。INotifyCollectionChanged&#xff1a;将集合的动态更改通知给侦…

MS-SQLSERVER--错用了LEN()函数

sqlserver数据导入oracle时发现字符长度不对。。下面是两个函数的区别&#xff1a;DATALENGTH 返回任何表达式所占用的字节数。LEN 返回给定字符串表达式的字符&#xff08;而不是字节&#xff09;个数&#xff0c;其中不包含尾随空格转载于:https://www.cnblogs.com/yooplmqj/…

rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

原文托管在Github: https://github.com/shellhub/blog/issues/52数据结构与算法之线性表-顺序表实现(C语言版本)前言数据结构与算法是一个程序员必备的技能之一,而顺序表更是每个程序员在面试过程中要经常被问到的&#xff0c;如Java语言中的ArrayList类的底层实现就是使用顺序…

浅析 record 使用场景

浅析 record 使用场景Intro之前我们有介绍过 record 基本知识&#xff0c;可以参考 C# 9 新特性 — record 解读&#xff0c;record 会实现基于值的类型比较&#xff0c;最近遇到的几个问题觉得用 record 来解决会非常方便&#xff0c;分享一下基于值的类型比较最近有遇到一个场…

jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

我正在学习Jersey / JAX-RS&#xff0c;我需要一些ExceptionMapper的帮助 .我有一个UserFacade类&#xff0c;AbstractFacade类和User类本身&#xff0c;都非常标准&#xff0c;主要是通过在Netbeans中创建一个带有Database的新Web Service RestFUL项目生成的 . 我的问题是&…

hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读

安装Hadoop软件系列&#xff0c;首选Linux系统&#xff0c;比如Ubuntu。如果你的系统是Windows&#xff0c;建议再安装一个Ubuntu&#xff0c;组成双系统&#xff0c;如此可以发挥各自系统的特点。使用U盘制作一个系统&#xff0c;拿出一块分区用作新装的系统&#xff0c;开机启…

后宫佳丽三千,假如古代皇帝也懂负载均衡算法...

古代皇帝&#xff0c;后宫佳丽三千&#xff0c;没法做到雨露均沾&#xff0c;但为了繁衍后代&#xff0c;子嗣繁盛&#xff0c;弱水三千&#xff0c;只取一瓢饮显然是不行的。不同的朝代有不同的宠幸妃子的方法&#xff0c;著名的有羊车望幸、掷筛侍寝、翻牌悬灯等等。如果皇帝…

常见DDoS技术方法和对应防御措施

DDOS***是现在最常见的一种******方式&#xff0c;下面就给大家简单介绍一下DDOS的七种***方式。 1.Synflood: 该***以多个随机的源主机地址向目的主机发送SYN包&#xff0c;而在收到目的主机的SYN ACK后并不回应&#xff0c;这样&#xff0c;目的主机就为这些源主机建立了大…

mac 配置php和mysql_Mac下配置PHP+MySql环境

由于最近需要布置mantis用来进行bug追踪&#xff0c;在此记录其过程。由于PHP apache环境在Mac OS上是自带的&#xff0c;所以不需要另处下安装包&#xff0c;只需要简单配置一下即可。首先打开终端输入命令&#xff1a;sudo vim /etc/apache2/httpd.conf其中有一行是这样的#Lo…

git使用的基本流程_git命令的基本使用

首先下载完git之后打开Git Bash配置你的邮箱和用户名&#xff08;github或gitee&#xff09;&#xff1a;$ git config --global user.name "注册时账号的名字"$ git config --global user.email "注册时使用的邮箱"获取ssh公钥&#xff1a;ssh-keygen -t …

软件性能测试与LoadRunner实战可以在网上和书店买到了

有很多朋友和学员对这本书已经期待很久了&#xff0c;今天可以幸福的告诉大家这本书&#xff0c;您可以在China-pub上订购了&#xff08;订购的链接&#xff1a;[url]http://www.china-pub.com/39876[/url]&#xff09;&#xff0c;也可以在书店买到喽。下面是专业人事的书评内…

Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言

还记得五年前的夏天&#xff0c;我在巨硬写着世界上最好的语言&#xff0c;有时也需要带着游标卡尺写着另一门语言。然而&#xff0c;我对这两门语言都不熟悉&#xff0c;如果能在 VS Code 中方便快捷地运行各种语言&#xff0c;那岂不是很方便&#xff1f;于是&#xff0c;我就…

mysql group where_[MySQL] 测试where group by order by的索引问题

1. select * from test where axx group by b order by c 如何加索引CREATE TABLE index_test (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT ,gid int(11) NOT NULL DEFAULT 0,age int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id)) ENGI…