登録日時: 2005年7月25日(月) 13:27 記事: 893
お住まい: 埼玉県東松山市
|
時間の測定には、GetTickCount関数が使えると思います。
HeapFreeをじかに書くと読みにくいと思うので コード: Function LoadFileData(FileName As *Byte) As *Byte
Dim ReadData As BytePtr
Dim FileSize As DWord
Dim hFile As HANDLE
Dim RBytes As Long
hFile=CreateFile(FileName,GENERIC_READ,0,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
FileSize=GetFileSize(hFile,NULL)
ReadData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,FileSize+1)
ReadFile(hFile,ReadData,FileSize,VarPtr(RBytes),ByVal 0)
CloseHandle(hFile)
LoadFileData=ReadData
End Function
Sub CloseFileData(Data As *Byte)
HeapFree(GetProcessHeap(),0,Data)
End Sub
Dim ReadData As *Byte
'読み込む
ReadData=LoadFileData("table.dat")
'ここで内容を使う
'最終処理
CloseFileData(ReadData) のように関数化すれば使いやすいかと思います
ところで自分で掛け算した場合と多次元配列を使った場合の違いについて調べてみたのですが、 出力結果 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]ソースコード コード: Dim A[99,99] As Byte
Dim B[9999] As Byte
Dim i As Long
Dim j As Long
Dim k As Long
k=A[i,j]
k=B[i*100+j] をコンパイルして出てきた実行ファイルを調べた結果
コード: k=A[i,j]の部分
XOR ECX,ECX
PUSH ECX
PUSH 0
PUSH j
POP EAX
IMUL EAX,EAX,1
ADD [ESP],EAX
PUSH i
POP EAX
IMUL EAX,EAX,100
ADD [ESP],EAX
POP EAX
IMUL EAX,EAX,1
POP ECX
ADD ECX,EAX
XOR EAX,EAX
MOV AL,[A+ECX]
PUSH EAX
POP EAX
AND EAX,255
PUSH EAX
POP EAX
MOV k,EAX
約46clock
k=B[i*100+j]の部分
XOR ECX,ECX
PUSH ECX
PUSH 0
PUSH i
PUSH 100
POP EBX
POP EAX
SUB ESP,4
IMUL EAX,EBX
MOV [ESP],EAX
PUSH j
POP EBX
POP EAX
SUB ESP,4
ADD EAX,EBX
MOV [ESP],EAX
POP EAX
IMUL EAX,EAX,1
ADD [ESP],EAX
POP EAX
IMUL EAX,EAX,1
POP ECX
ADD ECX,EAX
XOR EAX,EAX
MOV AL,[B+ECX]
PUSH EAX
POP EAX
AND EAX,255
PUSH EAX
POP EAX
MOV k,EAX
約50clock
ちなみに理想的な出力は
k=B[i*100+j]
を翻訳した時に
コード: MOV EAX,i
MOV EDX,j
LEA EAX,[EAX+EAX*4]
XOR ECX,ECX
LEA EAX,[EAX+EAX*4]
LEA EAX,[EDX+EAX*4]
MOV CL,[B+EAX]
MOV k,ECX で約6clock 等。 どうやら掛け算を使うくらいなら多次元配列を使った方がいいようです
_________________ Website→ http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
|
|