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