目录
回复内容:
首页 后端开发 php教程 语言的反射为什么比较慢,反射存在的意义是什么?为什么C++没有反射?

语言的反射为什么比较慢,反射存在的意义是什么?为什么C++没有反射?

Jun 17, 2016 am 08:31 AM
java php

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

热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.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

说明匹配表达式(PHP 8)及其与开关的不同。 说明匹配表达式(PHP 8)及其与开关的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表达式是一种新的控制结构,用于根据表达式的值返回不同的结果。1)它类似于switch语句,但返回值而非执行语句块。2)match表达式使用严格比较(===),提升了安全性。3)它避免了switch语句中可能的break遗漏问题,增强了代码的简洁性和可读性。

Java程序查找胶囊的体积 Java程序查找胶囊的体积 Feb 07, 2025 am 11:37 AM

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

See all articles