by konisi » 2008年6月14日(土) 13:05
時間の測定には、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 等。
どうやら掛け算を使うくらいなら多次元配列を使った方がいいようです
時間の測定には、GetTickCount関数が使えると思います。
HeapFreeをじかに書くと読みにくいと思うので[code]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)[/code]のように関数化すれば使いやすいかと思います
ところで自分で掛け算した場合と多次元配列を使った場合の違いについて調べてみたのですが、[hide=出力結果]ソースコード[code]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][/code]をコンパイルして出てきた実行ファイルを調べた結果
[code]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[/code]
ちなみに理想的な出力は
k=B[i*100+j]
を翻訳した時に
[code]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[/code]で約6clock 等。[/hide]どうやら掛け算を使うくらいなら多次元配列を使った方がいいようです