2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« JScriptのArrayオブジェクトからの取り出し(pop/shift)は、ともに遅い。 | トップページ | VBScriptやVBAからJScriptのArrayオブジェクトのインデックスアクセス »

2008年5月14日 (水)

JScriptのArrayオブジェクトからの取り出し(pop/shift)の代替

取り出し(pop/shift)は遅いので、For Eachで列挙するのが速くてよいでしょう。

Set sc=CreateObject("ScriptControl")
sc.Language="JScript"
set a=sc.Eval("new Array()")
t1=Timer
For k=1 To 1024*512
  a.push k
Next
MsgBox Timer-t1
'10.35156

t1=Timer
For Each x In a
Next
MsgBox Timer-t1
'0.3046875

もし、インデクスで取り出したければ、For Eachで配列に転写するか、Evalを使うとよいでしょう。

t1=Timer
redim b(a.length-1)
k=-1
For Each x In a
  k=k+1
  b(k)=x
Next
MsgBox Timer-t1
'1.210938

t1=Timer
For k=1 To a.Length
  x=Eval("a.[" & k-1 & "]")
Next
MsgBox Timer-t1
'13.78906

VBAの場合は、CallByName()も使えます。

t1 = Timer
For k = 1 To CallByName(a, "length", VbGet)
  x = CallByName(a, k - 1, VbGet)
Next
Debug.Print Timer - t1
'1.8125

« JScriptのArrayオブジェクトからの取り出し(pop/shift)は、ともに遅い。 | トップページ | VBScriptやVBAからJScriptのArrayオブジェクトのインデックスアクセス »