基於託管指針字節碼的線程間數據傳輸

本代碼演示瞭如何用託管指針的字節碼進行線程間數據傳輸的。不知何故,直接用AAuto原生的數值數組傳輸比用託管指針字節碼慢了很多,請大家斧正,在此不勝感激!話不多說,各位看了如下代碼自會明白。
先把如下代碼(文件名nb.aau)編譯成用戶庫,便於在main.aau中調用:

namespace nb
import raw
class DOUBLE{
    double v=0
}
class INT32{
    int v=0
}
//數值數組轉化爲託管指針字節碼,數值默認類型爲double
num2byte=function(numarr,numtype='double'){
    
var len
    
var ele
    
if numtype=='double'{
        ele=DOUBLE()
        len=8
    }
    
else{
        ele=INT32()
        len=4
    }
    
var bytearr=raw.malloc(len*#numarr)
    
for i=1;#bytearr;len{
        ele.v=numarr[(i+len-1)/len]
        
var tmp=raw.malloc(ele)
        
for j=0;len-1
            bytearr[i+j]=tmp[j+1]
    }
    
return bytearr  
}
//託管指針字節碼轉化爲數值數組,數值默認類型爲double
byte2num=function(bytearr,numtype='double'){
    
var len
    
var ele
    
if numtype=='double'{
        ele=DOUBLE()
        len=8
    }
    
else{
        ele=INT32()
        len=4
    }
    
var numarr={}
    
for j=1;#bytearr/len
        numarr[j]=raw.convert(bytearr,ele,len*(j-1)).v
    
return numarr
}


主調程序main.aau:

import time.performance
import nb
//託管指針字節碼與數值數組的相互轉化
io.open()
io.print(
"==========================================")
io.print(
"* 託管指針字節碼與數值數組的相互轉化示例 *")
io.print(
"==========================================")
io.print(
"示例 1: 小規模,驗證一下結果")
var numarr={1;2;255;256;257}
io.print(
"原始數值數組:")
for j=1;#numarr
    io.stdout.write(numarr[j],
' ')
io.print()
var bytearr=nb.num2byte(numarr,'int')
io.print(
"數值數組 --> 字節碼:")
for j=1;#bytearr
    io.stdout.write(bytearr[j],
' ')
io.print()
io.print(
"字節碼 --> 數值數組:")
var numarr2=nb.byte2num(bytearr,'int')
for j=1;#numarr2
    io.stdout.write(numarr2[j],
' ')
io.print(
'\n')
io.print(
"示例 2: 大規模,測一下運行效率")
numarr={}
for j=1;200000
    numarr[j]=j
io.print(
"數組數組長度",#numarr)
var tk=time.performance.tick()
bytearr=nb.num2byte(numarr,
'int')
io.print(
"數值數組 --> 字節碼:",time.performance.tick()-tk,'毫秒')
tk=time.performance.tick()
numarr2=nb.byte2num(bytearr,
'int')
io.print(
"字節碼 --> 數值數組:",time.performance.tick()-tk,'毫秒')
io.print(
'\n')
io.print(
"========================")
io.print(
"*  線程間數值數據傳輸  *")
io.print(
"========================")
fnum=
function(numarr){
    
var s=0
    
for j=1;#numarr
        s+=numarr[j]
    io.print(
"  數組元素之和:",s)
}
fbyte=
function(bytearr){
    
import nb
    
var numarr=nb.byte2num(bytearr,'int')
    
var s=0
    
for j=1;#numarr
        s+=numarr[j]
    io.print(
"  數組元素之和:",s)
}
numarr={}
for j=1;10000
    numarr[j]=j
io.print(
"數組數組長度",#numarr)
io.print(
'利用數值數組:')
tk=time.performance.tick()
handle=thread.create(fnum,numarr)
thread.wait(handle)
io.print(
"耗時:",time.performance.tick()-tk,'毫秒')
io.print(
'利用字節碼:')
tk=time.performance.tick()
bytearr=nb.num2byte(numarr,
'int')
handle=thread.create(fbyte,bytearr)
thread.wait(handle)
io.print(
"耗時:",time.performance.tick()-tk,'毫秒')
execute("pause")
io.close()

某次運行結果:

==========================================
* 託管指針字節碼與數值數組的相互轉化示例 *
==========================================
示例 1: 小規模,驗證一下結果原始數值數組:
1 2 255 256 257
數值數組 --> 字節碼:
1 0 0 0 2 0 0 0 -1 0 0 0 0 1 0 0 1 1 0 0
字節碼 --> 數值數組:
1 2 255 256 257
示例 2: 大規模,測一下運行效率

數組數組長度    200000
數值數組 --> 字節碼:   1531.6426094919 毫秒
字節碼 --> 數值數組:   100.48708815128 毫秒

========================

*  線程間數值數據傳輸  *
========================
數組數組長度    10000
利用數值數組:  
數組元素之和:        50005000
耗時:      352.52849365026 毫秒
利用字節碼: 
數組元素之和:        50005000
耗時:      19.031126827002 毫秒
注:系統配置 WinXP SP3,intel core2 CPU Quad Q8300 2.50GHz,內存金士頓兩條共4GB。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章