how to speed up collections iteration

P

Peter

I have the following code:
_transColl is a collection of classes and it contains about 42000 objects
My question is there any way I can make this code run faster?

I have found out that line 2 is realy expensive (time wise) :

'------------------------------------------------------------------

1 For n As Int32 = 1 To Me._transColl.Count - 1
2 ti = CType(Me._transColl(n), TranslateImport)
3 If ti.Key.Equals(key) Then
4 ti.TranslatedValue = val
5 End If
6 Next

'
' the following code is useless by it's very fast, proving that the line 2
is the culprint
' I've moved the line 2 out out the loop
'
ti = CType(Me._transColl(0), TranslateImport)

For n As Int32 = 1 To Me._transColl.Count - 1
If ti.Key.Equals(key) Then
ti.TranslatedValue = val
End If
Next


Thanks for any input?
 
T

tommaso.gastaldi

I like to avoid indices every time it is possible (2005), code is
clearer imho:

For Each TranslateImport As TranslateImport In Me._transColl
with TranslateImport
If .Key = key Then .TranslatedValue = Val()
end with
Next TranslateImport

-tom

Michel Posseth [MCP] ha scritto:
 
T

Trapulo

try a typed collection (start from a generic (Of TranslateImport), to avoid
runtime cast...
 
J

Jim Wooley

I have the following code:
Sorry I did not mention - I am running VS2003

You can try DirectCast over CType, but be sure the values in your collection
are only the type you are trying to cast to. This is one of the key advantages
of List(of T) over ArrayList(). I recommend Sahil Malik's comparison at http://codebetter.com/blogs/sahil.malik/archive/2005/01/02/40506.aspx.

In general, I would question iterating over 42000 in your business layer
rather than directly on the database as you are likely suffering a greater
penalty with the memory footprint of that many objects, including the network
bandwidth of fetching them, than you are with the casting.

Jim Wooley
http://devauthority.com/blogs/jwooley/default.aspx
 
P

Peter

I like to avoid indices every time it is possible (2005), code is
clearer imho:

For Each TranslateImport As TranslateImport In Me._transColl
with TranslateImport
If .Key = key Then .TranslatedValue = Val()
end with
Next TranslateImport

-tom

Michel Posseth [MCP] ha scritto:
You might try Directcast instead of ctype


regards


Michel

I have tried the fillowing in .NET 2.0 and it works realy fast, but in .NET
1.1 is slow the same as using for next loop.
Is there anything I can do to speed this up in .NET 1.1 ?


For Each TranslateImport As TranslateImport In Me._transColl
with TranslateImport
If .Key = key Then .TranslatedValue = Val()
end with
Next TranslateImport
 
J

Jay B. Harlow [MVP - Outlook]

Peter,
First I would question having 42000 objects in a collection.

| Is there anything I can do to speed this up in .NET 1.1 ?

What type of "collection" are you using? Array, ArrayList, VB.Collection, or
something else?

| For Each TranslateImport As TranslateImport In Me._transColl
| with TranslateImport
| If .Key = key Then .TranslatedValue = Val()
| end with
| Next TranslateImport
Is the .key property unique in the collection? Have you considered a
HashTable (.NET 1.x) or Dictionary(Of T) (.NET 2.0) instead. Where .Key is
the key to the HashTable/Dictionary.

Alternatively: Can you sort the collection by .Key, then use a BinarySearch?


..NET 2.0 has made improvements in the performance of large DataSets, does
using a DataSet instead of a class & a collection improve performance?

--
Hope this helps
Jay B. Harlow [MVP - Outlook]
..NET Application Architect, Enthusiast, & Evangelist
T.S. Bradley - http://www.tsbradley.net


|
| | >I like to avoid indices every time it is possible (2005), code is
| > clearer imho:
| >
| > For Each TranslateImport As TranslateImport In Me._transColl
| > with TranslateImport
| > If .Key = key Then .TranslatedValue = Val()
| > end with
| > Next TranslateImport
| >
| > -tom
| >
| > Michel Posseth [MCP] ha scritto:
| >
| >> You might try Directcast instead of ctype
| >>
| >>
| >> regards
| >>
| >>
| >> Michel
| >>
| >>
| >> "Peter" <[email protected]> schreef in bericht
| >> | >> >I have the following code:
| >> > _transColl is a collection of classes and it contains about 42000
| >> > objects
| >> > My question is there any way I can make this code run faster?
| >> >
| >> > I have found out that line 2 is realy expensive (time wise) :
| >> >
| >> > '------------------------------------------------------------------
| >> >
| >> > 1 For n As Int32 = 1 To Me._transColl.Count - 1
| >> > 2 ti = CType(Me._transColl(n), TranslateImport)
| >> > 3 If ti.Key.Equals(key) Then
| >> > 4 ti.TranslatedValue = val
| >> > 5 End If
| >> > 6 Next
| >> >
| >> > '
| >> > ' the following code is useless by it's very fast, proving that the
| >> > line 2
| >> > is the culprint
| >> > ' I've moved the line 2 out out the loop
| >> > '
| >> > ti = CType(Me._transColl(0), TranslateImport)
| >> >
| >> > For n As Int32 = 1 To Me._transColl.Count - 1
| >> > If ti.Key.Equals(key) Then
| >> > ti.TranslatedValue = val
| >> > End If
| >> > Next
| >> >
| >> >
| >> > Thanks for any input?
| >> >
| >> >
| >
|
| I have tried the fillowing in .NET 2.0 and it works realy fast, but in
..NET
| 1.1 is slow the same as using for next loop.
| Is there anything I can do to speed this up in .NET 1.1 ?
|
|
| For Each TranslateImport As TranslateImport In Me._transColl
| with TranslateImport
| If .Key = key Then .TranslatedValue = Val()
| end with
| Next TranslateImport
|
|
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top