Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Optimizing Code - please help

Posted on 2000-02-22
7
Medium Priority
?
166 Views
Last Modified: 2010-05-02
Experts,
   I've been writing some code with my friend for a program (not school related!) we are working on.  Unfortunately, the code that we pumped out does not quite go as fast as what we would like.  We tried converting it to C++ code but we aren't that great with the language so it didn't exactly run much faster.  So if any some experts could help get either this VB code to run really fast or to help us out with writing a faster routine in C++ i would greatly appreciate it!  THANKS!
The code is as follows:
'------------
Dim len1 As Double
Dim ival As Double
Dim string1(10000) As String
Dim tst As Byte
Dim numoftimes As Long
 
    Open "c:\windows\desktop\test.exe" For Binary As #1
   
    'Input
    For len1 = 0 To 200000000 Step 3000  'input file
        For z = 1 To 3000  'for every 3000 bytes
            Get #1, len1 + z, tst  'input byte
            ival = (len1 + z - 1) / 3000
            string1(ival) = string1(ival) & Fill(CStr(tst), 3)'tack onto string
            If EOF(1) Then Exit For
        Next z
        numoftimes = (len1 + z - 1)
        If EOF(1) Then Exit For
    Next len1
    Close #1
'----
Private Function Fill(ByVal data As String, ByVal length As Integer) As String
 Fill = data
 If Len(data) < length Then Fill = String(length - Len(data), "0") & Fill
End Function
'----
0
Comment
Question by:TrEaSoN
  • 3
  • 3
7 Comments
 
LVL 7

Expert Comment

by:Vbmaster
ID: 2549113
What I can figure out from your code the following code should do the same thing, but about 30x faster...

  Dim a As Long
  Dim ByteSize As Long
  Dim ByteArray() As Byte
  Dim StringCount As Long
  Dim StringArray() As String
 
  ByteSize = 3000
  ReDim ByteArray(0 To ByteSize - 1)
 
  Open "c:\windows\desktop\test.exe" For Binary As #1
  ReDim StringArray(LOF(1) \ ByteSize + IIf(LOF(1) Mod ByteSize = 0, -1, 0))
  Do Until EOF(1)
    If ((LOF(1) - Seek(1) + 2) <= ByteSize) Then
      ByteSize = LOF(1) - Seek(1) + 2
      ReDim ByteArray(0 To ByteSize - 1)
    End If
    Get #1, , ByteArray
    StringCount = StringCount + 1
    StringArray(StringCount - 1) = Space$(3 * ByteSize)
    For a = 1 To ByteSize
      Mid$(StringArray(StringCount - 1), 1 + (3 * (a - 1))) = Format$(ByteArray(a - 1), "000")
    Next
  Loop
0
 
LVL 7

Accepted Solution

by:
Vbmaster earned 1200 total points
ID: 2549137
Here's a improved version before I get to sleep, this one is about 50x-60x faster than your original code...

  Dim ByteSize As Long
  Dim ByteArray() As Byte
  Dim StringCount As Long
  Dim StringArray() As String
  Dim a As Long
 
  ByteSize = 3000
  ReDim ByteArray(0 To ByteSize - 1)
 
  Open "c:\windows\desktop\test.exe" For Binary As #1
  ReDim StringArray(LOF(1) \ ByteSize + IIf(LOF(1) Mod ByteSize = 0, -1, 0))
  Do Until EOF(1)
    If ((LOF(1) - Seek(1) + 2) <= ByteSize) Then
      ByteSize = LOF(1) - Seek(1) + 2
      ReDim ByteArray(0 To ByteSize - 1)
    End If
    Get #1, , ByteArray
    StringCount = StringCount + 1
    StringArray(StringCount - 1) = String$(3 * ByteSize, "0")
    For a = 1 To ByteSize
      If (ByteArray(a - 1) < 10) Then
        Mid$(StringArray(StringCount - 1), 2 + 1 + (3 * (a - 1))) = ByteArray(a - 1)
      ElseIf (ByteArray(a - 1) < 100) Then
        Mid$(StringArray(StringCount - 1), 1 + 1 + (3 * (a - 1))) = ByteArray(a - 1)
      Else
        Mid$(StringArray(StringCount - 1), 1 + (3 * (a - 1))) = ByteArray(a - 1)
      End If
    Next
  Loop
  Erase ByteArray

This new one has some new code inside the For...Next block and the String$ function is used instead of the Space$ function, the big speed improvement is because with this new version you do not need to use the (very slow) Format$ function.

But now I'm not sure if there can be any more ("major") optimizations made on this one. ;)
0
 
LVL 5

Expert Comment

by:KDivad
ID: 2549140
What are you trying to do? I've looked over the code (and even tried it) but I can't find a single reason for it. Speeding it up is probably quite easy, but I don't know what you want it to do.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 5

Expert Comment

by:KDivad
ID: 2549144
I guess I was right, since vbmaster posted twice while I was still looking at it. ;-)
0
 
LVL 7

Expert Comment

by:Vbmaster
ID: 2549161
To me it looks like the code extracts the ascii code of all the bytes inside a file, and adds it to a string value like 065066067068 for a file containing the text "ABCD"...

Perhaps this function is used in some kind of editor or perhaps Treason needs to know the ascii code for something else.
0
 
LVL 5

Expert Comment

by:KDivad
ID: 2550235
That's kinda what it looked like, but what got me was this:

ival = (len1 + z - 1) / 3000
string1(ival) =

ival SEEMED to me to be a useless procession of values (1,6,3,0,0... or something like that) when I stepped through the code. Maybe I'm missing something...(again!).

Later,
0
 

Author Comment

by:TrEaSoN
ID: 2552410
thanks for your help!
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you have ever used Microsoft Word then you know that it has a good spell checker and it may have occurred to you that the ability to check spelling might be a nice piece of functionality to add to certain applications of yours. Well the code that…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Suggested Courses

886 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question