先把如下代碼(文件名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.performanceimport 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。