網(wǎng)站首頁 編程語言 正文
C++ 中有個(gè)內(nèi)聯(lián)函數(shù),使用 inline 來修飾函數(shù),編譯器就會(huì)對(duì)其進(jìn)行優(yōu)化,將此函數(shù)作為代碼判斷插入到調(diào)用處。
函數(shù)調(diào)用在執(zhí)行時(shí),首先要在棧中為形參和局部變量分配存儲(chǔ)空間,然后還要將實(shí)參的值復(fù)制給形參,接下來還要將函數(shù)的返回地址(該地址指明了函數(shù)執(zhí)行結(jié)束后,程序應(yīng)該回到哪里繼續(xù)執(zhí)行)放入棧中,最后才跳轉(zhuǎn)到函數(shù)內(nèi)部執(zhí)行。這個(gè)過程是要耗費(fèi)時(shí)間的。
另外,函數(shù)執(zhí)行 return 語句返回時(shí),需要從棧中回收形參和局部變量占用的存儲(chǔ)空間,然后從棧中取出返回地址,再跳轉(zhuǎn)到該地址繼續(xù)執(zhí)行,這個(gè)過程也要耗費(fèi)時(shí)間。
而 C# 中可以通過在函數(shù)上使用特性,告訴編譯器要對(duì)其進(jìn)行優(yōu)化,達(dá)到相同目的。
[MethodImpl(MethodImplOptions.AggressiveInlining)]
示例如下:
using System; using System.Diagnostics; using System.Runtime.CompilerServices; class Program { const int _max = 10000000; static void Main() { int sum = 0; Stopwatch s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { sum += Method1(); } s1.Stop(); Stopwatch s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { sum += Method2(); } s2.Stop(); Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.Read(); } static int Method1() { return "one".Length + "two".Length + "three".Length + "four".Length + "five".Length + "six".Length + "seven".Length + "eight".Length + "nine".Length + "ten".Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] static int Method2() { return "one".Length + "two".Length + "three".Length + "four".Length + "five".Length + "six".Length + "seven".Length + "eight".Length + "nine".Length + "ten".Length; } }
測(cè)試結(jié)果:
21.92 ns 3.22 ns
原文鏈接:https://www.whuanle.cn/archives/995
相關(guān)推薦
- 2022-04-12 詳解pyqt中解決國際化tr()函數(shù)不起作用的問題_python
- 2022-11-02 python中l(wèi)ist列表刪除元素的四種方法實(shí)例_python
- 2022-11-07 使用react-native-doc-viewer實(shí)現(xiàn)文檔預(yù)覽_React
- 2022-04-04 Python數(shù)據(jù)處理-導(dǎo)入導(dǎo)出excel數(shù)據(jù)_python
- 2022-04-28 Python?常用的print輸出函數(shù)和input輸入函數(shù)_python
- 2023-01-29 Python??序列化反序列化和異常處理的問題小結(jié)_python
- 2022-04-03 Android?PopUpWindow實(shí)現(xiàn)卡片式彈窗_Android
- 2023-10-14 SqlServer--get 和 post 請(qǐng)求 http接口
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支