<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理
    最近重讀了《Programming Lua》,對協(xié)程做了重點復(fù)習(xí)。眾所周知,Ruby1.9引入了Fiber,同樣是coroutine,不過Ruby Fiber支持全對稱協(xié)程(通過fiber庫),而Lua只支持所謂半對稱協(xié)程。

    ??? 這里將對Lua、LuaJIT和Ruby Fiber的切換效率做個對比測試,測試場景很簡單:兩個coroutine相互切換達到5000萬次,統(tǒng)計每秒切換的次數(shù),各測試多次取最佳。

    ??? lua的程序如下:
    ???
    c1=coroutine.create(function?()
    ?????????????????????
    while?true?do
    ???????????????????????coroutine
    .yield()
    ?????????????????????end
    ????????????????????end)

    c2
    =coroutine.create(function?()
    ?????????????????????
    while?true?do
    ???????????????????????coroutine
    .yield()
    ?????????????????????end
    ????????????????????end)

    local?start=os.clock()
    local?count=50000000

    for?i=1,count?do
    ?coroutine
    .resume(c1)
    ?coroutine
    .resume(c2)
    end

    print(4*count/(os.clock()-start))

    ??? 考慮到在循環(huán)中事實上發(fā)生了四次切換:main->c1,c1->main,main->c2,c2->main,因此乘以4。

    ??? Ruby Fiber的測試分兩種,采用transfer的例程如下:

    require?'fiber'
    require?'benchmark'

    Benchmark
    .bm?do?|x|
    ??MAX_COUNT
    =50000000
    ??f1
    =Fiber.new?do?|other,count|
    ?????
    while?count<MAX_COUNT
    ??????other
    ,count=other.transfer(Fiber.current,count.succ)
    ?????end
    ??end

    ??f2
    =Fiber.new?do?|other,count|
    ????
    while?count<MAX_COUNT
    ??????other
    ,count=other.transfer(Fiber.current,count.succ)
    ????end
    ??end

    ??x
    .report{
    ????f1
    .resume(f2,0)
    ??}
    end
    ???? Ruby Fiber采用resume/yield的例程如下:
    require?'benchmark'
    f1
    =Fiber.new?do
    ??
    while?true
    ????Fiber
    .yield
    ??end
    end
    f2
    =Fiber.new?do
    ??
    while?true
    ????Fiber
    .yield
    ??end
    end

    COUNT
    =50000000

    Benchmark
    .bm?do?|x|
    ??x
    .report{
    ?????COUNT
    .times?do
    ?????????f1
    .resume
    ?????????f2
    .resume
    ?????end
    ??}
    end



    ???? 測試環(huán)境:
    ????????? CPU :??? Intel(R) Core(TM)2 Duo CPU???? P8600? @ 2.40GHz
    ????????? Memory:? 3GB
    ????????? System :? Linux dennis-laptop 2.6.31-14-generic #48-Ubuntu SMP
    ????????? Lua??? : 5.1.4
    ????????? ruby? :? 1.9.1p378
    ????????? LuaJIT:? 1.1.5和2.0.0-beta2

    ????? 測試結(jié)果如下:
    ????
    ??Lua?LuaJIT 1.1.5
    ?LuaJIT 2.0.0-beta2
    ?ruby-transfer
    ?ruby-resume/yield
    ?次數(shù)?6123698?9354536?24875620?825491?969649


    ????? 結(jié)論:
    ????? 1、lua的協(xié)程切換效率都是百萬級別,luaJIT 2.0的性能更是牛叉,切換效率是原生lua的4倍,達到千萬級別。
    ????? 2、相形之下,Ruby Fiber的效率比較差了,十萬級別。
    ????? 3、Ruby使用transfer的效率比之resume/yield略差那么一點,排除一些測試誤差,兩者應(yīng)該是差不多的,從ruby源碼上看resume/yield和transfer的調(diào)用是一樣的,resume還多了幾條指令。
    ????? 4、額外信息,Ruby Fiber和lua coroutine都只能跑在一個cpu上,這個測試肯定能跑滿一個cpu,內(nèi)存占用上,lua也比ruby小很多。
    ?


    評論

    # re: Lua、LuaJIT Coroutine和Ruby Fiber的切換效率對比  回復(fù)  更多評論   

    2010-03-03 11:08 by 99書城
    暗示大家撒暗示

    # re: Lua、LuaJIT Coroutine和Ruby Fiber的切換效率對比  回復(fù)  更多評論   

    2010-03-04 14:38 by mryufeng
    Lua的coroutine設(shè)計上非常的輕量 確定就是單線程

    http://blog.yufeng.info
    主站蜘蛛池模板: 日本牲交大片免费观看| 亚洲免费观看视频| 九九综合VA免费看| 亚洲国产精品无码AAA片| 最近新韩国日本免费观看| 中文字幕无码亚洲欧洲日韩| 亚洲av午夜精品一区二区三区 | 久久夜色精品国产噜噜亚洲a| 亚洲AV无码乱码精品国产| 日本免费人成视频在线观看| 亚洲aⅴ无码专区在线观看| 久久精品国产亚洲AV果冻传媒| 99精品全国免费观看视频| 中文字幕的电影免费网站| 国产无遮挡又黄又爽免费视频| a级毛片100部免费观看| 亚洲一区二区三区在线观看网站| 亚洲午夜无码久久久久| 成年人在线免费看视频| 久久免费精品一区二区| 爱爱帝国亚洲一区二区三区| 亚洲久本草在线中文字幕| 四虎国产精品免费视| 精品国产无限资源免费观看| 久青草视频97国内免费影视| 久久精品国产亚洲夜色AV网站| 免费无码不卡视频在线观看| 香港a毛片免费观看| 人妻仑刮八A级毛片免费看| 亚洲AV综合色区无码二区爱AV| 亚洲综合AV在线在线播放| 日韩特黄特色大片免费视频| 99re在线这里只有精品免费| 一级特级女人18毛片免费视频| 国产精品亚洲专区在线观看| 亚洲成熟xxxxx电影| 一个人看www在线高清免费看| 国产综合免费精品久久久| 特级无码毛片免费视频| 亚洲av日韩av天堂影片精品| 亚洲Av无码乱码在线播放|