5

VB.NETで配列が空かどうかを確認する最速の方法を知りたいです。配列はすでに初期化されているので、それを調べるチェックは使用できません。これは以下の現在のコードです:

If Not (cubes(threadnumber)(i).objects.GetLength(0) = 0) Then
   cubes(threadnumber)(i).objects = New Double() {}
   ReDim cubes(threadnumber)(i).objects(-1)
End If

私はいくつかのテストを行い、使用が少し速いことを知っていますが、配列の長さが1の場合は0を返す.GetUpperBoundと思うので、これが機能するかどうかはわかりません。.GetUpperBound

これを(少しでも)スピードアップするためのすべての/すべての方法は非常に役立ちます。このプログラムは完了するのに何年もかかり、上記のコードの最初の行は時間の大部分を占め、1億3600万回呼び出されます。

また、誰かがスピードアップする方法を知っているなら...次のループも素晴らしいでしょう!

4

4 に答える 4

5

LengthGetLength私のシステムよりも約2倍高速です( Length136M回の呼び出しには0.650秒かかりますが、呼び出しGetLength (0)には1.480秒かかります)。

また、アレイをReDimする理由もわかりません。すでに、新しいアレイを作成しています。

キューブが多次元配列の場合、これが最速のコードになると思います。

If cubes(threadnumber)(i).objects.Length > 0 Then
    cubes(threadnumber)(i).objects = New Double() {}
End If

キューブが多次元配列(たとえばリストなど)でない場合は、cubes(threadnumber)コードをループから外す必要があります。

アップデート

Lengthデバッガなしでリリースモードで実行する場合よりも6倍高速です。この場合、システムでは0.181秒と1.175秒かかります。これは、JITがへの呼び出しをインライン化するが、への呼び出しはインライン化しないためと考えられます。GetLengthLengthGetLengthLengthGetLength

これは私が使用したテストコードです。

于 2012-11-22T09:01:43.403 に答える
2
if myarray is nothing then...

また

if myarray isnot nothing then...
于 2012-11-22T05:29:12.420 に答える
1

GetLengthは、配列に要素が含まれているかどうかを確認するための最速の方法です。このコードを高速化することはないと思います。

ただし、これを1億3600万回呼び出しているコードは、おそらく最適化される可能性があります。

あなたのコードを見てください:

If Not (cubes(threadnumber)(i).objects.GetLength(0) = 0) Then
   cubes(threadnumber)(i).objects = New Double() {}
   ReDim cubes(threadnumber)(i).objects(-1)
End If

要素があるかどうかをテストしている理由は、配列を再縮小してメモリを解放できるようにするためだと思います。メモリを解放するためのより良い方法は、代わりにキューブオブジェクトをクリアし、配列がスコープから外れるようにすることです。

于 2012-11-22T06:12:57.553 に答える
0

いくつかの徹底的なテストと分析の結果、(少なくともこれまでのところ)最も速い方法と思われる方法を見つけました。この小さな変更を加えることで、私のプログラムは500〜600%高速化されました。

オブジェクト配列にアイテムが追加されている場合、2番目の次元のインデックスがまだリストにない場合は、キューブの2番目の次元のインデックスもリストに追加します。ただし、他の提案は大歓迎です。

于 2012-11-23T02:46:01.693 に答える