目錄
回复内容:
首頁 後端開發 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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 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中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋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和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

什麼是跨站點偽造(CSRF),您如何在PHP中實施CSRF保護? 什麼是跨站點偽造(CSRF),您如何在PHP中實施CSRF保護? Apr 07, 2025 am 12:02 AM

在PHP中可以通過使用不可預測的令牌來有效防範CSRF攻擊。具體方法包括:1.生成並在表單中嵌入CSRF令牌;2.在處理請求時驗證令牌的有效性。

See all articles