最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua性能優(yōu)化技巧(二):基本事實(shí)

 更新時(shí)間:2015年04月21日 08:53:58   投稿:junjie  
這篇文章主要介紹了Lua性能優(yōu)化技巧(二):基本事實(shí),本文講解了一些編譯器和寄存器的一些知識(shí),需要的朋友可以參考下

在運(yùn)行任何代碼之前,Lua都會(huì)把源代碼翻譯(預(yù)編譯)成一種內(nèi)部的格式。這種格式是一個(gè)虛擬機(jī)指令序列,與真實(shí)的CPU所執(zhí)行的機(jī)器碼類(lèi)似。之后,這個(gè)內(nèi)部格式將會(huì)被由一個(gè)包含巨大的switch結(jié)構(gòu)的while循環(huán)組成的C代碼解釋執(zhí)行,switch中的每個(gè)case對(duì)應(yīng)一條指令。

可能你已經(jīng)在別處了解到,從5.0版開(kāi)始,Lua使用一種基于寄存器的虛擬機(jī)。這里所說(shuō)的虛擬機(jī)“寄存器”與真正的CPU寄存器并不相同,因?yàn)楹笳唠y于移植,而且數(shù)量非常有限。Lua使用一個(gè)棧(通過(guò)一個(gè)數(shù)組和若干索引來(lái)實(shí)現(xiàn))來(lái)提供寄存器。每個(gè)活動(dòng)的函數(shù)都有一個(gè)激活記錄,也就是棧上的一個(gè)可供該函數(shù)存儲(chǔ)寄存器的片段。因此,每個(gè)函數(shù)都有自己的寄存器[1]。一個(gè)函數(shù)可以使用最多250個(gè)寄存器,因?yàn)槊總€(gè)指令只有8位用于引用一個(gè)寄存器。

由于寄存器數(shù)目眾多,因此Lua預(yù)編譯器可以把所有的局部變量都保存在寄存器里。這樣帶來(lái)的好處是,訪(fǎng)問(wèn)局部變量會(huì)非??臁@?,如果a和b是局部變量,語(yǔ)句

復(fù)制代碼 代碼如下:

a = a + b

將只會(huì)生成一個(gè)指令:
復(fù)制代碼 代碼如下:

ADD 0 0 1

(假設(shè)a和b在寄存器里分別對(duì)應(yīng)0和1)。作為對(duì)比,如果a和b都是全局變量,那么這段代碼將會(huì)變成:
復(fù)制代碼 代碼如下:

GETGLOBAL 0 0 ; a
GETGLOBAL 1 1 ; b
ADD 0 0 1
SETGLOBAL 0 0 ; a

因此,可以很簡(jiǎn)單地得出在Lua編程時(shí)最重要的性能優(yōu)化方式:使用局部變量!

如果你想壓榨程序的性能,有很多地方都可以使用這個(gè)方法。例如,如果你要在一個(gè)很長(zhǎng)的循環(huán)里調(diào)用一個(gè)函數(shù),可以預(yù)先將這個(gè)函數(shù)賦值給一個(gè)局部變量。比如說(shuō)如下代碼:

復(fù)制代碼 代碼如下:

for i = 1, 1000000 do
    local x = math.sin(i)
end

比下面這段要慢30%:
復(fù)制代碼 代碼如下:

local sin = math.sin
for i = 1, 1000000 do
    local x = sin(i)
end

訪(fǎng)問(wèn)外部局部變量(或者說(shuō),函數(shù)的上值)沒(méi)有直接訪(fǎng)問(wèn)局部變量那么快,但依然比訪(fǎng)問(wèn)全局變量要快一些。例如下面的代碼片段:

復(fù)制代碼 代碼如下:

function foo (x)
    for i = 1, 1000000 do
        x = x + math.sin(i)
    end
    return x
end

print(foo(10))


可以?xún)?yōu)化為在foo外聲明一次sin:

復(fù)制代碼 代碼如下:

local sin = math.sin
function foo (x)
    for i = 1, 1000000 do
        x = x + sin(i)
    end
    return x
end

print(foo(10))


第二段代碼比前者要快30%。

盡管比起其他語(yǔ)言的編譯器來(lái)說(shuō),Lua的編譯器非常高效,但是編譯依然是重體力活。因此,應(yīng)該盡可能避免運(yùn)行時(shí)的編譯(例如使用loadstring函數(shù)),除非你真的需要有如此動(dòng)態(tài)要求的代碼,例如由用戶(hù)輸入的代碼。只有很少的情況下才需要?jiǎng)討B(tài)編譯代碼。

例如,下面的代碼創(chuàng)建一個(gè)包含返回常數(shù)值1到100000的若干個(gè)函數(shù)的表:

復(fù)制代碼 代碼如下:

local lim = 10000
local a = {}
for i = 1, lim do
    a[i] = loadstring(string.format("return %d", i))
end

print(a[10]()) --> 10


執(zhí)行這段代碼需要1.4秒。

通過(guò)使用閉包,我們可以避免使用動(dòng)態(tài)編譯。下面的代碼只需要十分之一的時(shí)間完成相同的工作:

復(fù)制代碼 代碼如下:

function fk (k)
    return function () return k end
end

local lim = 100000
local a = {}
for i = 1, lim do a[i] = fk(i) end

print(a[10]()) --> 10

相關(guān)文章

  • C++中調(diào)用Lua配置文件和響應(yīng)函數(shù)示例

    C++中調(diào)用Lua配置文件和響應(yīng)函數(shù)示例

    這篇文章主要介紹了C++中調(diào)用Lua配置文件和響應(yīng)函數(shù)示例,本文使用Lua文件作為配置文件,并寫(xiě)了幾個(gè)響應(yīng)函數(shù)以便在C++中使用,需要的朋友可以參考下
    2015-07-07
  • 深入談?wù)刲ua中神奇的table

    深入談?wù)刲ua中神奇的table

    table 在lua中是一個(gè)非常常用的數(shù)據(jù)結(jié)構(gòu),可以用來(lái)存放各種類(lèi)型的元素,下面這篇文章就來(lái)給大家介紹了關(guān)于lua中神奇的table的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-07-07
  • lua中使用packagepath解決多個(gè)項(xiàng)目的路徑?jīng)_突問(wèn)題

    lua中使用packagepath解決多個(gè)項(xiàng)目的路徑?jīng)_突問(wèn)題

    這篇文章主要介紹了lua中使用packagepath解決多個(gè)項(xiàng)目的路徑?jīng)_突問(wèn)題,本文描述了問(wèn)題的產(chǎn)生環(huán)境和原因,并給出了解決方法,需要的朋友可以參考下
    2015-04-04
  • Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解

    Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解

    這篇文章主要介紹了Cocos2d-x中調(diào)用Lua及HelloWorld.lua源碼分解,本文最后總結(jié)了一些Lua的語(yǔ)法,需要的朋友可以參考下
    2014-09-09
  • Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類(lèi)型

    Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類(lèi)型

    這篇文章主要介紹了Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類(lèi)型,本文同時(shí)講解了開(kāi)發(fā)環(huán)境的搭建,需要的朋友可以參考下
    2014-09-09
  • Lua腳本語(yǔ)言簡(jiǎn)介

    Lua腳本語(yǔ)言簡(jiǎn)介

    這篇文章主要介紹了Lua腳本語(yǔ)言簡(jiǎn)介,Lua最著名的應(yīng)用是在暴雪公司的網(wǎng)絡(luò)游戲WOW中, Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過(guò)來(lái)調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用,本文就是對(duì)Lua語(yǔ)言的詳細(xì)介紹,需要的朋友可以參考下
    2014-09-09
  • Lua中三種循環(huán)語(yǔ)句的使用講解

    Lua中三種循環(huán)語(yǔ)句的使用講解

    今天小編就為大家分享一篇關(guān)于Lua中三種循環(huán)語(yǔ)句的使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 在Lua程序中使用MySQL的教程

    在Lua程序中使用MySQL的教程

    這篇文章主要介紹了在Lua程序中使用MySQL的教程,是Lua入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua基礎(chǔ)迭代器的使用實(shí)例

    Lua基礎(chǔ)迭代器的使用實(shí)例

    今天小編就為大家分享一篇關(guān)于Lua基礎(chǔ)迭代器的使用實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

    Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

    這篇文章主要介紹了Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

明溪县| 石家庄市| 化州市| 石嘴山市| 阳江市| 东山县| 车险| 日土县| 乐昌市| 龙江县| 武强县| 衢州市| 澄城县| 乌拉特后旗| 泸西县| 宁化县| 上林县| 呼伦贝尔市| 上林县| 襄城县| 丹棱县| 盖州市| 三明市| 廊坊市| 肥城市| 运城市| 迁西县| 库伦旗| 金川县| 大理市| 江城| 叶城县| 盐亭县| 从化市| 霍州市| 桦川县| 腾冲县| 阿瓦提县| 北川| 安康市| 六安市|