??xml version="1.0" encoding="utf-8" standalone="yes"?>波多野结衣AV无码久久一区,精品久久久久成人码免费动漫 ,久久精品国产亚洲av日韩http://www.shnenglu.com/tdzl2003/zh-cnSun, 11 May 2025 02:35:04 GMTSun, 11 May 2025 02:35:04 GMT60Lua.js 与标准Lua的差?/title><link>http://www.shnenglu.com/tdzl2003/archive/2014/11/06/208796.html</link><dc:creator>天地之灵</dc:creator><author>天地之灵</author><pubDate>Wed, 05 Nov 2014 21:07:00 GMT</pubDate><guid>http://www.shnenglu.com/tdzl2003/archive/2014/11/06/208796.html</guid><wfw:comment>http://www.shnenglu.com/tdzl2003/comments/208796.html</wfw:comment><comments>http://www.shnenglu.com/tdzl2003/archive/2014/11/06/208796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/tdzl2003/comments/commentRss/208796.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tdzl2003/services/trackbacks/208796.html</trackback:ping><description><![CDATA[<div>error(e)</div><div></div><div>Will throw a `Error` object containing the error message.</div><div></div><div>load (ld [, source [, mode [, env]]])</div><div></div><div>Only ld and env has meaning now.</div><div></div><div>dofile/loadfile, io.open, io.close, os.tmpname, os.remove, os.rename</div><div></div><div>Not supported cause there's no build-in file system supported for javascript. You can reimplement these functions on specific environment.</div><div></div><div>package.searchers, package.config, package.path, package.cpath, package.loadlib, package.searchpath</div><div></div><div>No build-in searchers for Lua files. You can reimplement searcher on specific environment. Mostly use package.preload instead.</div><div></div><div>No C loader/C lib. Use inline javascript instead.</div><div></div><div>next (table, index)</div><div></div><div>Not supported. use pairs instead.</div><div></div><div>pairs(t)</div><div></div><div>Will be supported next version, but cannot check table changes while iterating.</div><div></div><div>Will be slow if you call pairs but not iterate on it.</div><div></div><div>xpcall(f, msgh[, arg1, ...])</div><div></div><div>The stack was rewinded when msgh is called. So you cannot do anything like traceback the stack or read local variables.</div><div></div><div>string.*</div><div></div><div>There's encoding issues with lua.js now. Mostly, string.* API will use unicode instead of ANSI.</div><div></div><div>string.find, string.format, string.gmatch, string.gsub, string.match</div><div></div><div>Pattern will be supported in future. string.find with "plain = true" is usable.</div><div></div><div>os.execute, os.exit, io.popen, os.getenv</div><div></div><div>No process supported in lua.js.</div><div></div><div>os.setlocale</div><div></div><div>Not supported.</div><div></div><div>coroutine.*</div><div></div><div>The whole coroutine lib will not be supported for a long time. The browser context cannot support this feature.</div><div></div><div>debug.*</div><div></div><div>The whole debug lib is not supported now. But maybe some of them will be supported in future.</div><div></div><div>metatable:</div><div></div><div>__gc was not supported.</div><div></div><div>__mode was not supported.</div><div></div><img src ="http://www.shnenglu.com/tdzl2003/aggbug/208796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tdzl2003/" target="_blank">天地之灵</a> 2014-11-06 05:07 <a href="http://www.shnenglu.com/tdzl2003/archive/2014/11/06/208796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua.js,一个Lua2JS~译器,一个新的JSq行环境下的LuaҎhttp://www.shnenglu.com/tdzl2003/archive/2014/11/05/208791.html天地之灵天地之灵Wed, 05 Nov 2014 12:17:00 GMThttp://www.shnenglu.com/tdzl2003/archive/2014/11/05/208791.htmlhttp://www.shnenglu.com/tdzl2003/comments/208791.htmlhttp://www.shnenglu.com/tdzl2003/archive/2014/11/05/208791.html#Feedback2http://www.shnenglu.com/tdzl2003/comments/commentRss/208791.htmlhttp://www.shnenglu.com/tdzl2003/services/trackbacks/208791.html http://luajs.org

其实现在在js环境中运行lua代码的方案已l很多了Q这些方案大都分Zc:
VM on VMQ在js环境中移植或重新实现一个Lua VM。典型的代表是lua.vm.js和MoonShineJS?q种Ҏ的优势在于完整还原了整个标准luaQ但主要~陷在于Q原本通过虚拟机执行的Lua VM效率׃理想Q再通过JSq行Q效率就更打一层折扣?br /> ȝ处理型:使用ȝ工具铑ְLua语言译成JS。如LLVM-Lua 加上javascript backendQ还有一个名为lua2js的项目。这个方案的优势在于能做一些较为深入的优化Q缺点主要在于必ȝU处理,不能直接在web上执行,或者体U庞大,以至于本w加载都需要较长时间。除此以外,只能ȝ处理 D了字W串执行Q如dostring{)的不可能实现Q还会媄响Lua中的packagel构?br />
Lua.js采用一个不同的ҎQ它lua代码转变Z个AST树,l过一pd的{换函敎ͼ最后Z个合乎js标准的AST树,随后生成一个合法的js代码。因此{换后直接执行的代码,比VM on VM要快2-5倍,高效的执行速度有助于让你的应用或游戏展现流畅的极致体验?/div>

另外Q压~后的Lua.js难以|信的小。这里是当前lua.js和lua.vm.js的对比:
文g大小 传输大小(gz压羃)
lua.js 22.7K 8.3K
lua.vm.js 638K 203K

管当前lua.jsq有一些功能没有实玎ͼ如metatable、Lua标准库等Q,但可以预见全部实现后的尺怹不会有大q的增长Q基本上不会过30K/12K?/div>
再谈论性能Q这里用了lua.vm.js官方的几个benchmark代码Q稍做修改得可以在当前版本的lua中运行)Qlua.js和lua.vm.js均在chrome下运行)Q结果如下:

lua.js lua.vm.js lua 5.2.3 luaJIT 2.0.3 Scale What it measures
Binary Trees 8.526s 10.198s 4.006s 0.731s seconds (lower numbers are better) GC Performance
Scrimark 26.98 8.84 30.52 1249.73 MFLOPS (higher numbers are better) numeric computation performance

在当前版本中QGC仅仅比lua.vm.js略快Q这是因为现在lua.js对于table模拟q处于较为原型的阶段Q没有经q充的优化。但即ɘq样也比lua.vm.js更快
而在数D上Q性能q超lua.vm.jsQD官方luaQ这同样是在lua.jsq没有经q充优化的前提下。经q优化,完全有超q官方Lua的可能性?/div>
lua.js的benchmark可以?a >http://luajs.org上找刎ͼlua.vm.js的benchmark?http://kripken.github.io/lua.vm.js/lua.vm.js.html

如果你对lua.js感兴,在这里可以下载独立的js文gQ?/div>
lua.js处于不完善状态,如果你决定尝试用,务必x本项目的更新Q及时替换更新的版本Q?/div>

天地之灵 2014-11-05 20:17 发表评论
]]>pomelo实战填坑?后端坑之server "..." "..." register master failedhttp://www.shnenglu.com/tdzl2003/archive/2013/11/10/204188.html天地之灵天地之灵Sun, 10 Nov 2013 07:23:00 GMThttp://www.shnenglu.com/tdzl2003/archive/2013/11/10/204188.htmlhttp://www.shnenglu.com/tdzl2003/comments/204188.htmlhttp://www.shnenglu.com/tdzl2003/archive/2013/11/10/204188.html#Feedback0http://www.shnenglu.com/tdzl2003/comments/commentRss/204188.htmlhttp://www.shnenglu.com/tdzl2003/services/trackbacks/204188.html
server "account-server-1" "account" register master failed
阅读讨论帖后发现Q是新版d了adminServer.jsonQ需要在q里d每种服务器类型的tokenQ默认创建的只有connectorQ?br />
[
    {
        "type": "connector",
        "token": "aga...xn"
    },
    {
        "type": "account",
        "token": "aga...xn"
    }
]

daccountcd以后Qtoken随便填,自己生成个够长的字W串填进d可)
不同服务器用相同的token也可以,取决于你的安全性要求程度?br />
Ҏ官方的描qͼ在单机部|时Q是可以没有q个文g的,但是如果要分布式部vQ必Lq个文gQ当做不同服务器_主要是master和其它服务器的monitorlgQ之间通讯的验证串来用?/div>


天地之灵 2013-11-10 15:23 发表评论
]]>pomelo实战填坑?前端坑之Buffer is not defined http://www.shnenglu.com/tdzl2003/archive/2013/11/10/204187.html天地之灵天地之灵Sun, 10 Nov 2013 03:17:00 GMThttp://www.shnenglu.com/tdzl2003/archive/2013/11/10/204187.htmlhttp://www.shnenglu.com/tdzl2003/comments/204187.htmlhttp://www.shnenglu.com/tdzl2003/archive/2013/11/10/204187.html#Feedback0http://www.shnenglu.com/tdzl2003/comments/commentRss/204187.htmlhttp://www.shnenglu.com/tdzl2003/services/trackbacks/204187.html
Uncaught ReferenceError: Buffer is not defined

阅读代码后分析如下:
模块 pomelo-protocol 的代码,试图兼容node.js与浏览器端,其区分方法是 判断module是否是一个object?br />
('object' === typeof module ? module.exports : (this.Protocol = {}),'object' === typeof module ? Buffer : Uint8Array, this);

在node.js中,module是一个objectQ而在览器端Q早期版本的component实现 把module的函数自w作为最后一个参敎ͼ命名为moduleQ?br />
  if (!module.exports) {
    module.exports = {};
    module.client = module.component = true;
    module.call(this, module.exports, require.relative(resolved), module);
  }

所以typeof(module)得到的是一个function?br />
但是随着component的更斎ͼcomponent改变了这个特性:
  if (!module._resolving && !module.exports) {
    var mod = {};
    mod.exports = {};
    mod.client = mod.component = true;
    module._resolving = true;
    module.call(this, mod.exports, require.relative(resolved), mod);
    delete module._resolving;
    module.exports = mod.exports;
  }

可以看到最后一个参数现在是一个新创徏出来的ObjectQ所以现在在览器上Qpomelo-protocol也认为现在正在node.js环境中,于是报错了?br />
一?strong>临时的workaround办法是,在require("promelo-protocol")之前Q先准备好BufferQ代码如下:

window.Buffer = Uint8Array;
var protocol = require('pomelo-protocol');
window.Protocol = protocol;
delete window.Buffer;
q样问题暂时消除了。当Ӟ最靠谱的办法还是在pomelo-protocol中修改识别环境的办法。稍后我会向pomelo提交pull-request帮助解决q一问题?/div>


天地之灵 2013-11-10 11:17 发表评论
]]>我们是Seed Engine研发团队Q我们是最接近dev的reseacherQ节选)http://www.shnenglu.com/tdzl2003/archive/2013/08/11/202468.html天地之灵天地之灵Sun, 11 Aug 2013 11:37:00 GMThttp://www.shnenglu.com/tdzl2003/archive/2013/08/11/202468.htmlhttp://www.shnenglu.com/tdzl2003/comments/202468.htmlhttp://www.shnenglu.com/tdzl2003/archive/2013/08/11/202468.html#Feedback2http://www.shnenglu.com/tdzl2003/comments/commentRss/202468.htmlhttp://www.shnenglu.com/tdzl2003/services/trackbacks/202468.html
每个不同的项目,我们都有可能q速地接触一两个全新的技术ƈ试之,而不用早早的把其中一个技术的全部l节当做自己ln的事业?br />
我们认ؓQ对未知东西的迅速了解、分析能力是非常重要的,q也可以认ؓ是我们团队的天分所在。我们不会花太多旉Ml研M个开源项目的源代码,相反Q我们迅速的阅读完它提供的tutorialQ查看社Z搜烦l果Q和很多已经用过它们及用q同c项目的论,熟悉它的风格与用法,猜测它的整体l构Q思考它能做什么,不能做什么,擅长做什么,不擅长做什么,再然后,通过api reference扫描L我们所需要的东西?br />

我们崇拜q膜拜那些发明了JIT、Defered Shading的hQ崇拜ƈ膜拜boost、tbb、lfds、LuaJIT、V8、Qt、libuv、mongodb、redis{项目的贡献者。我认ؓ把他们(及它们)的牛g处在我们的品们中充分展现是我们能ؓ他们做的最有意义的事情?br />
我们会尝试不断的改进我们所用的每一个技术,优化l节Q通过更优雅的~码使其更具扩展性,提高性能或降低用L错的可能Q毫无疑问我们要做相当多reseacher的工作。只是有一点,我们不发明技术本w?br />
Q我们的Q主要工作内容之一是x目Q以及其它h目Q的每一个过E,扑և其中M一个导致Q何h工作~慢或阻塞的部分Q只要是通过技术手D可以改善的Q我们都会通过我们的努力去解决它们?br />
q就是我们,Seed Engine团队。立志以最快的速度Q做最友好的游戏引擎。我们的技术未必超前,但永不落后!

和我们有相同x的h们,Ƣ迎你加入我们!


天地之灵 2013-08-11 19:37 发表评论
]]>
Seed Engine中的输入pȝQ一Q、底层架构、历?/title><link>http://www.shnenglu.com/tdzl2003/archive/2013/04/12/199363.html</link><dc:creator>天地之灵</dc:creator><author>天地之灵</author><pubDate>Thu, 11 Apr 2013 17:49:00 GMT</pubDate><guid>http://www.shnenglu.com/tdzl2003/archive/2013/04/12/199363.html</guid><wfw:comment>http://www.shnenglu.com/tdzl2003/comments/199363.html</wfw:comment><comments>http://www.shnenglu.com/tdzl2003/archive/2013/04/12/199363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/tdzl2003/comments/commentRss/199363.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tdzl2003/services/trackbacks/199363.html</trackback:ping><description><![CDATA[<div>今天看了叛大?KlayGE?a >输入pȝ的改q系列文?/a>Q觉得可以谈谈Seed Engine中的输入pȝ?/div><div>因ؓSeed Engine诞生之初Q就定位Z要面向Android、iOS{移动设备(直到2012q?月才有了Flashq_的内部版本,才开始正式需求鼠标事ӞQ所以Seed的输入模块除了对键盘做了单支持(主要是出于调试目的)外,在很长的一D|间内Q鼠标事仉是被wrap成ؓ触摸事g。所有后l关于输入的工作都是针对触摸来做的。所以这文章主要重点讲触摸q个斚wQ尤其是手势识别的做法?/div><div>在Seed发展至今的期_面了大量复杂的需求,不断改进完善Q目前还有很多不善美的地斏V这文章会回顾一下这个过E,重点介绍一下当前的处理机制Q再展望一下将来期望进行的改进工作?/div><div></div><div><br />Seed目前总计支持四种输入Q键盘、鼠标、触摸、重力感应?/div><div>所有的输入会被响应的处理模块封装成一个structQ这个struct的头四个字节表明了触摸的cd。在单线E模式下Q这个struct会被直接传递给应用。在多线E模式下Q这个struct会在堆上分配Q将指针传递给逻辑U程。这L好处是在逻辑U程忙的时候,消息处理函数可以更及时返回,避免诸如H口拖动卡顿之类的问题?/div><div>q一部分极其单,因ؓ单,所以不Ҏ出问题。之所以把底层架构攑֜历史之前谈,正是因ؓ自从2011q?0月䆾Seed诞生以来Q引擎的q部分代码几乎从未变q?/div><div>对于Lua层来_q部分的接口一直表Cؓ一个全局事gQinput.key、input.touch{等Q参数struct会被iLuaWrapper(Seed中一个神U组?包装成Lua可以直接讉K的数据,由Lua脚本dM上层的处理?/div><div></div><div><br /><strong>裸奔时代</strong></div><div></div><div><br />Seed诞生以后的一D|间内Q当时的工作重心在完?D渲染基础?D场景理Q?D物理{等较ؓJ杂的模块上。因为没有具体项目的负担Q当时的输入模块只以满调试需求、实现简单交互ؓ目的。因此,Seed?011q?0月以前,一直处在输入裸奔的状态。譬如只用键盘做操控Q那q接注册input.keyȝ听需要的事g。ؓ了实现诸如简单的按钮之类的功能,当时产生了一堆垃圾代码,在事仉直接判定坐标{等。当Ӟq样写代码是不可能做出没有BUG的游戏来的,于是我们在一个游戏项目的原型阶段l束后不久的旉Q迅速推ZW一套框架?/div><div></div><div><br /><strong>山寨时代</strong></div><div></div><div><br />因ؓ需求紧q,做Q何游戏至都不了做一堆能tap的button出来Q所以我们抓紧推ZW一版的input_ex插g?/div><div>input_ex以尽可能单的方式实现了对指定对象的触怺件处理。场景中的node可以被注册到input_ex中,以接受tap、hold、drag事g。在touchdown的时候,input_ex会遍历所有注册的l点以找到被命中的nodeQ之后的消息都会z֏l这个node?/div><div>好吧Q至现在可以创Z堆不同的button了。input_ex的严重不主要体现在功能上:</div><div>        1、input_ex中的手写状态机Q几乎决定了除了tap、hold、drag以外Q每加一个新的操作种c都是一个巨大的困难?/div><div>        2、input_ex不能很好的处理多点触摸。在多点的设备上各种出问题,以至于后来在某些目里,屏蔽了除?h指(对应安卓里的0h指)以外的所有操作?/div><div>        3、消息最开始就定了对象,随后的过E不能改变消息的对象。譬如一个scrollview上面有一堆buttonQ那么当button截获了消息的时候,scrollview无法处理相应的拖拽事g了?/div><div></div><div>除此以外Q在使用上,每个节点存在一个独立的用于处理输入的对象,其生命周期需要手动管理,错误的用会D各种问题。初学者几乎很隑ֆ出正的代码。因为实现复杂,input_ex本n也在很长的时间内都存在引用关pȝBUGQ导致不需要的资源不能被正的释放。M来说Q用input_ex插g做游戏简直是一D不堪回忆的黑历双Ӏ?br /><br /><strong>山寨时代之后<br /></strong></div><div></div><div>在用input_ex完成了三四个界面操作单的游戏后Q我们开始构思新的输入系l。我们理想中的输入系l应该符合如下几个条Ӟ</div><div>1、很好的支持多点触摸。这包含两方面:W一Q必能够很好的识别利用多个手指的操作,譬如scale, pinch, rotate{。第二,我们认ؓ对于大屏q的触屏讑֤Q能让多个玩家在不同的地方互不干扰的q行多个操作也是很有必要的需求,q会l游戏设计师带来很多新奇的玩法创意?/div><div>2、一定要很方便的加入各种不同的操作识别。我们希望能够实现很多有创意的小游戏Q依靠触摸的操作来做很多有意思的事情。我们也希望我们的界面能够交互v来更P可以操作控制的地Ҏ多。那么操作一定不能只局限于区区数种Q一定要在特定的游戏里就能通过代码d大量不同的全新操作才行?/div><div>3、操作对象的识别更智能。在scrollview 上面的button做scroll操作Ӟ操作对象要能正确的变成scrollview?/div><div>4、根据操作对象所接受的事件有所不同Q以及其父结Ҏ接受的事件有所不同Q对同一事g的处理可能会有差别。譬如一个button接受tapQ当触摸q移动的时候,只要没移开范围Q逻辑应等待手指松开时再判定为tap成功Q正如你在windows下按住一个按钮然后小范围拖动鼠标Qclickq不会因此而失败)。但假如q个button有一个父l点甚至是祖先结Ҏ受dragQ那么早在刚开始移动的时候,应该判定ؓtap取消Q事件{为drag事g而派发给相应的祖先结炏V?/div><div>5、不会ؓ了满上面的需求,把上层逻辑代码搞的太麻烦。最理想的情况下Q上层逻辑代码只要选择好自己所接受的操作种c,然后安心{待事g监听器被调用好了?/div><div></div><div>而我们不惌Q?/div><div>1、像安卓那样复杂的事件分z机Ӟ所有的触摸都被l在一起依ơ分z下去,在结点上依据cd的不同写代码d对应的操作。我们认为应该要有一个很好的手势识别底层Q仅仅把l点兛_的信息抛l它?/div><div>2、像HTML DOM那样的事件冒泡机制。因摸处理的复杂性,在touch down的时候往往Ҏ不能定真正用户惌q行何种操作。而如果等操作q行完了才给予反馈,那操作过E就很难得到非常及时的反馈。在上述scrollview和button的例子里Qbutton必须首先获得事g以立卛_现被按下的效果,{到用户的操作能够明ؓ一个scroll操作之后Q再由scrollview来处理后l的事g。再加上之前所q的期望4Q已l不是简单的对同一事g的冒泡以满的?/div><div></div><div>真的有一套框架能完美的解x们的需求吗Q下一章vQ我会逐步讲解我们为此所做的努力?/div><img src ="http://www.shnenglu.com/tdzl2003/aggbug/199363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tdzl2003/" target="_blank">天地之灵</a> 2013-04-12 01:49 <a href="http://www.shnenglu.com/tdzl2003/archive/2013/04/12/199363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LuaJIT之callback大坑l\?/title><link>http://www.shnenglu.com/tdzl2003/archive/2013/02/24/198045.html</link><dc:creator>天地之灵</dc:creator><author>天地之灵</author><pubDate>Sun, 24 Feb 2013 06:36:00 GMT</pubDate><guid>http://www.shnenglu.com/tdzl2003/archive/2013/02/24/198045.html</guid><wfw:comment>http://www.shnenglu.com/tdzl2003/comments/198045.html</wfw:comment><comments>http://www.shnenglu.com/tdzl2003/archive/2013/02/24/198045.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/tdzl2003/comments/commentRss/198045.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/tdzl2003/services/trackbacks/198045.html</trackback:ping><description><![CDATA[q期在做<a >node.js</a>?a >LuaJIT port</a>?a >LuaJIT</a>是当前已知最快的脚本JIT~译器,拿来做服务器再好不过?br /> 发现node.js底层所用的?a >libuv</a>直是个神器,包含了网l、文件系l、计时器{等一堆堆的有用功能,windows、linux、MacOS{均支持Q而且是纯C的APIQ和LuaJITl合会比较友好,理论上不用Q何额外的C代码Q依?a >ffi?/a>可以搞定,l过<a >试验</a>也确实如此,于此同时发现LuaJIT也真器也,居然可以直接把Lua函数当做C函数指针传进d回调Q正当我t躇满志的准备跑下性能试开始做上层装的时候,l果楞了Q?br /> <br /> 1、Lua版的idleCZQ等待一个idle事g被调?e7Q一千万Q次Q在C下只需要区?.1U,在lua下需要?0U多Qƈ且内存在q个q程里猛涨猛涨再猛涨Q最后的gcq程耗费了更久的旉Q?br />     原版的在<a >q里</a>QLua版的?a >q里</a>?br /> 2、尝试添?000ơidle事gQLuaJIT直接报错Qtoo many callbacks<br />3、其他不同的试均体玎ͼ性能严重不过兟?br /><br />然后在ffi的说明里发现?a >q个</a>,提到了几个问题:<br />1、callback占用某些总量有限的系l资源,所以用q的callback需要释放,q且同时存在的callback只能?00-1000个?br />2、callback函数不会被自动gcQ需要用一些麻烦的办法手动来释?br />3、callback会很慢。文中提CcM于lua_call的消耗及argument marshalling的消耗。这点会在下面详l讲q?br /><br />ȝ来说Qluajit里的callbackQ是在内存里生成了一段代码Q这段代码的功能是把参数{换好Q然后再调用对应的lua函数。(q有一些奇奇怪怪的开销Q我个h认ؓq才是主要开销Q后面会详细讲述Q,因此有同时存在的总量上限Q虽然我也不明白Z么就因此了,但大致就是那么回事吧Q,q且很慢Q很慢,很,慢,?#8230;…?#8230;…<br /><br />基本上,解决Ҏ那么几U:<br />1、做一些特定的装Q用C额外~写一个函数做一些处理,在这个函数里用其他方式(lua_pcall{)去调用,q样调用参数的类型会受限一些。经试q个只能提升50%左右Q距M前的300倍差距还差得q?#8230;…Q,主要是还有一些关键的开销Q在下面详细讲述Q无法避免?br />2、改写被使用的C库,拒绝回调Q用其他办法实现。这是LuaJIT官方所推荐的,原文如下Q?br /><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #e6ecff;">For new designs </span><strong style="color: #404040; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #e6ecff;">avoid push-style APIs</strong><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #e6ecff;">: a C function repeatedly calling a callback for each result. Instead </span><strong style="color: #404040; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #e6ecff;">use pull-style APIs</strong><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #e6ecff;">: call a C function repeatedly to get a new result. Calls from Lua to C via the FFI are much faster than the other way round. Most well-designed libraries already use pull-style APIs (read/write, get/put).</span><br />但像libuvq样的库Q改写难度有些大……关键在于重新设计整个l构为pull-style很困难,同时会导致相x档废弃,增加了额外的工作量?br />3、小q度改写使用的C库,公开一些必ȝ内容Q然后把其中的一部分在lua里实玎ͼ保所有callback调用的时机均在lua中,废弃掉原始的C API。这LҎ说不用改变Q何的接口Q但是工作量也不,取决于库的复杂程度?br /><br />最l我在node.lua中选择了方?。事实证明效果确实很好,在还有一些会带来额外开销的功能没加进ȝ情况下,之前的test优化C0.08s左右Q预计全部完成后开销?.15s之内Q很接近UC实现的性能?br /><br />然后我又做了若干实验Qƈ且在freelist里和LuaJIT的创始hMikeh了一会,得到了一些结论:<br /><br />1、回调的argument marshalling是重大瓶颈之一。虽然不知道Z么,Lua对C的调用,q回值的marshalling性能很高Q我推测是由于原??br />2、把Lua-function cast成C function pointer是另一重大瓉Q如果存在反复的cd转换Q这里会很要命。这里包含了之前所说的生成指o序列的开销Q但cast本n也会h巨大的开销Q我试一个C function cast?C function pointerQ都带来了极大的开销。据Mike_q个开销也是原因3D?br />3、导致程序运行很慢的原因Q归根结底:某些行ؓ会导致JIT失效Q在没有JIT的情况下Q本w运行性能差不多就有几十倍的损失Q再加上一些额外开销会因此被攑֤Q最后就得到了不可接受的性能损失……<br /><br />最后ȝQ目前应该在LuaJIT的ffi库中避免使用函数指针Q用Lua本n来封装回调函敎ͼ如果接口需要)Q方可获得LuaJIT提供的卓性能?img src ="http://www.shnenglu.com/tdzl2003/aggbug/198045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/tdzl2003/" target="_blank">天地之灵</a> 2013-02-24 14:36 <a href="http://www.shnenglu.com/tdzl2003/archive/2013/02/24/198045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.ssc992.cn" target="_blank">þ99ֻƵƷ8</a>| <a href="http://www.a-house.com.cn" target="_blank">˾þþƷӰԺ</a>| <a href="http://www.jvfl.cn" target="_blank">ҹƷþ2021 </a>| <a href="http://www.npz571.cn" target="_blank">ŷ˾þþƷ</a>| <a href="http://www.xeyh.cn" target="_blank">þþAVҰ</a>| <a href="http://www.shy114.cn" target="_blank">ŷִִþþ</a>| <a href="http://www.dnf530.cn" target="_blank">þþƷ91þۺ鶹</a>| <a href="http://www.zouzouqiaoqiao.cn" target="_blank">þùӰԺ</a>| <a href="http://www.kybdt.cn" target="_blank">鶹AV뾫Ʒþ</a>| <a href="http://www.me79.cn" target="_blank">޹Ʒþþ</a>| <a href="http://www.ai7c.cn" target="_blank">þþƷѹۿ</a>| <a href="http://www.lvyoubuy.cn" target="_blank">뾫Ʒþþ</a>| <a href="http://www.mortels.cn" target="_blank">þøŮ߳MBA</a>| <a href="http://www.cpfang.cn" target="_blank">seguiþùƷ</a>| <a href="http://www.wuxicld.cn" target="_blank">AVպƷþþþþþ</a>| <a href="http://www.baifeng.net.cn" target="_blank">þþþӰԺŮ</a>| <a href="http://www.wyj416.cn" target="_blank">˾ƷۺϾþþþ</a>| <a href="http://www.ha-jc.cn" target="_blank">Ʒ˾þþþӰԺ</a>| <a href="http://www.hp6000.cn" target="_blank">ľþþþר</a>| <a href="http://www.nn75.cn" target="_blank">һþþ</a>| <a href="http://www.139shops.cn" target="_blank">AëƬþþƷ</a>| <a href="http://www.iysb.cn" target="_blank">þúݺݸ߳޾Ʒ</a>| <a href="http://www.7111393.cn" target="_blank">޾Ʒ97þĻ</a>| <a href="http://www.mofeigzs.cn" target="_blank">ٸ޾þþþþ</a>| <a href="http://www.sxttzs.cn" target="_blank">99þۺϹƷ</a>| <a href="http://www.globalimports.cn" target="_blank">Ʒþ</a>| <a href="http://www.seekme.com.cn" target="_blank">ۺϾþþƷɫ</a>| <a href="http://www.wow-diamond.com.cn" target="_blank">ձþþþƷĻ</a>| <a href="http://www.buksk.cn" target="_blank">91Ʒ91þþþø</a>| <a href="http://www.jy06.cn" target="_blank">޳ɫWWWþվ</a>| <a href="http://www.huoguopot.cn" target="_blank">պAVëƬƷþþ</a>| <a href="http://www.h9iet.cn" target="_blank">󽶾þĻ</a>| <a href="http://www.hbguangtao.cn" target="_blank">ھƷþþþӰԺձ</a>| <a href="http://www.chcbszxw.cn" target="_blank">޹ƷþõӰŷ</a>| <a href="http://www.zmcgmih22.cn" target="_blank">þþƷaĻ</a>| <a href="http://www.hanxuefs.com.cn" target="_blank">ձþĻ</a>| <a href="http://www.77ns.cn" target="_blank">þ99Ʒþ99С˵</a>| <a href="http://www.jusunglabel.com.cn" target="_blank">ճˮþ޾Ʒtv</a>| <a href="http://www.nxjinniu.com.cn" target="_blank">þerƷѹۿ8</a>| <a href="http://www.loverhouse.cn" target="_blank">ĻhdþþƷ</a>| <a href="http://www.shgdb.cn" target="_blank">99þþƷëƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>