搜索
首页后端开发php教程语言的反射为什么比较慢,反射存在的意义是什么?为什么C++没有反射?

1.php,java,C#都有反射,但是很多教程都说反射比较慢,那么反射为什么比较慢?
2.既然他比较慢为什么这些语言都提供反射,反射对于这些语言是必须的吗?
3.为什么C++没有反射,C++也是面向对象的啊

回复内容:

通常不是反射慢, 而是用了反射的代码做不了某些优化...

反射慢的情况可能是调用时得做逆优化, 或者是语言和反射 API 的设计蛋疼, 使得反射调用必须增加一些装箱拆箱参数重排异常重抛等等额外工作.

就算同一种语言, 反射快慢也是和实现相关的. 例如运行时对象元数据都保留着, 并且对对象结构基本不做优化, 那反射就和普通方法一样快. 现在的编译期通过改进的程序分析, 也可以把某些反射代码优化成和普通代码一样快的程度吧.

再说"反射" 连 C 都可以做, 例如 __typeof__ 可以编译期获取一个变量的类型, 没有 __typeof__ 一些宏你就是写不出的... 而 dlsym 就可以看成 C 的 "运行时反射". C++ 还可以用模板特化在编译期获取一些类型的信息. 至于什么用, 代码写多了经常想想怎么 Don't Repeat Yourself 就明白了. 最开始学.net的时候我也一直奇怪。。。这货要了干嘛?重点书上举的例子莫名其妙 attribute居然是给代码加注释。。。蛇精病啊(也可能是我到现在都没理解到这一层)
然后我最近在撸MVC(多年webform感觉现在是MVC大潮要跟上潮流) 然后我down了个MVCMusicStore在看 这里头Model层直接给属性加了个[Required]特性。。。然后我就在想 卧槽卧槽卧槽 劳资还在苦逼的在ASPX页面写各种校验呢!
然后的然后 我发现这货只能MVC用 然后我就不服了 于是我自己撸了套控件出来 直接绑字段(其实大体上就是asp.net自带的那套控件加了个BindTo属性) ---你看这里就要用反射了吧-----页面的CRUD逻辑全部都不怎么用写了 然后既然有了BindTo属性 那我就可以直接拿到那个[Required]特性了 于是我在页面初始化的时候把每个有BindTo属性的控件循环了一遍 然后看看有没有Required特性 --------你看这里还是反射--------然后组个Dictionary再序列化成Json到前端, 前端写个JS去校验----这里是用到把JS嵌入到dll-----然后我就彻底告别写蛋疼的绑定字段代码和校验代码了

反射比较慢什么的,其实是不对的。你拿他跟谁比较啊,你没有反射就做不了某些事情,所以当你要做某些事情的时候,你就必须用反射。当然了,你做a=b+c这种事情的时候,反射是慢,这就跟interpreting和jit的区别一样嘛。


说来,反射其实具有用的。我www.gaclib.net 用C++,就给造了一套反射,没反射很多declarative programming的方法都没法再imperative programming language上做啊,说白了就是要创造DSL。你又要DSL,又要DSL跟原来的语言的结构能交互是吧,不就是要求你的语言具有一定的动态性,反射在这个时候就有用了……


至于C++嘛,这是他爹的口味问题。

The earliest computers were programmed in their native assembly language, which were inherently reflective as these original architectures could be programmed by defining instructions as data and using self-modifying code. As programming moved to higher-level languages such as C, this reflective ability disappeared (outside of malware) until programming languages with reflection built into their type systems appeared. 这个问题要切身的用javac#做项目的人才知道反射的好处,特别是项目的框架的加载。反射不能一概而论的性能,有的地方反射就很快,某些地方来说性能也不是问题,比如框架模块的加载,一般只会反射然后加载一次,当然热插拔的模块会动态加载。
反射这种东西要虚拟机或者运行平台才好处理,像c++这种原生字节,能够提供运行时类型就已近非常不错了。
还有,面向对象是面向对象,反射不属于面向对象的硬指标。
最后说一句,cpp有cpp的写法,反射什么离远点。 我只说说我所理解的编程语言中反射的意义。

你在上班,去了躺茅房回来发现你的桌子上有一张纸条,上面写着“XX领导让你去找他一趟,立刻!”。此时,你一定会马不停蹄的跑去找领导了。

好了。这个场景里,“XX领导让你去找他一趟,立刻!”是一条语句指令,而你“马不停蹄的跑去找领导”就是对这条语句指令的执行。

因为你是人,你是高级动物,你是有自省能力的。也就是说,你在跑去找领导的途中或者之后,你会知道:我是因为看到了纸条上的“XX领导让你去找他一趟,立刻!”我才去的,进一步的,你会知道这是在上班时间,所以领导找你估计是有工作上的事情要问你,等等等等,也就是说:你知道你自己是在干什么

问题来了:计算机程序在执行完一系列语句指令后,它知道自己执行的是啥么?它知道它自己是在干什么么?反射,就是试图在语言层面提供一种这样的能力:让代码有自省能力,让代码知道自己在干什么,尽管目前的实现还很初级、很浅薄。 有些实现不使用反射,程序写起来不美且不自动。
我看到某些JAVA项目,一个action-mappings配置顶天的时候,
再看看struts最新特性不需要如此配置的时候(有可能举例错了,接触java没多久),我就默默的哭了有没有!

很多地方,使用了反射,可以实现很优雅的实现方式,而且尼玛的只要短短几行代码,知道吗!

应用场景的话,有一个,权限分配。根据模块、控制器、方法为粒度的权限配置。
需要使用到反射来知道有哪些控制器和方法。

当然,我说的是PHP的,而且反射不止这么一点点好处! 比如在数据库里有一张数据表有若干字段,我们代码中有个类,里面有若干成员。
如果我们的需求是把代码中的那个类的实例写入到数据表中时,就存在一个“类的哪个成员的值写入到数据表中的哪个字段”的需求。

这个需求可以不使用反射就能实现,但是笨拙低效,不灵活。如果语言有反射语法,那么实现这个需求就可以做的简洁灵活(写代码效率)高效。

至于反射的性能.......这都不是个事,如果你觉得反射性能不好,那么不使用反射就是了。
在我的实践中,反复测量过一块高频度使用反射的代码块的性能,怎么测那个代码块耗时都是0 -1ms(测量精度也是1ms)。所以起码在我的这个应用场景中(响应一次操作耗时0.6 - 1.2 s),反射的性能消耗是可以忽略不计的。

最后再说一句老生常谈的话 : 不要过早考虑优化(和性能问题),因为不把整个系统做出来的时候你猜测的性能瓶颈经常是不是真实系统的性能瓶颈。 你听没听过数据驱动
用反射会愉快很多 语言的反射为什么比较慢,反射本就是多加入的一块东西,加上之后肯定比没加之前慢(至少不会更快,如果没用到的话)。

反射是一种编程手段,有反射的语言内置了这种能力而已,无反射的语言一般可以自行实现反射。
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java数据结构之AVL树详解Java数据结构之AVL树详解Jun 01, 2022 am 11:39 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

一文掌握Java8新特性Stream流的概念和使用一文掌握Java8新特性Stream流的概念和使用Jun 23, 2022 pm 12:03 PM

本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版