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]どうやら掛け算を使うくらいなら多次元配列を使った方がいいようです