Function Declaration

M

Mike Labosh

How do you define whether the return value of a function is ByRef or ByVal?

I have a utility class that cleans imported records by doing *really heavy*
string manipulation in lots of different methods, and it operates on
DataTables in excess of 100,000 rows of anywhere between 4 and 30 columns.

I'd like to get the functions to return ByRef for greater speed and memory
efficiency, but I can't see how to do that.

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"
 
S

Scott M.

I would first suggest that you use a StringBuilder, rather than Strings for
heavy string manipulation.

Second, what is your function returning? If it returns a Reference Type,
then you are only getting a copy of the pointer to the reference type, not a
copy of the reference type itself.
 
M

Mike Labosh

I would first suggest that you use a StringBuilder, rather than Strings for
heavy string manipulation.

Actually, most of the stuff uses Regex's. But I do use StringBuilder where
I can. StringBuilder let me do one of our export batches in half the time
it used to take :):):)
Second, what is your function returning? If it returns a Reference Type,
then you are only getting a copy of the pointer to the reference type, not
a copy of the reference type itself.

Pretty much all the method prototypes in this class look like this:

Public Function CleanSomething(ByRef value As String) As String

There is one method that returns a Structure, also.

I just want to make sure I'm returning the return value ByRef for greater
speed / efficiency.

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"
 
M

Mythran

Mike Labosh said:
Actually, most of the stuff uses Regex's. But I do use StringBuilder
where I can. StringBuilder let me do one of our export batches in half
the time it used to take :):):)


Pretty much all the method prototypes in this class look like this:

Public Function CleanSomething(ByRef value As String) As String

There is one method that returns a Structure, also.

I just want to make sure I'm returning the return value ByRef for greater
speed / efficiency.

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"

A function's return value can't be ByRef or ByVal. It's just what it
returns. Now, the parameters that go into the function can be ByRef or
ByVal.

HTH,

Mythran
 
S

Scott M.

A function's return value can't be ByRef or ByVal. It's just what it
returns. Now, the parameters that go into the function can be ByRef or
ByVal.

Not necessarily true for situations when a function returns an object
instance.

If string objects are being created in the function and then the string
object variable is returned, a copy of the pointer gets created if the
return value is captured like this:

Dim X As String = function()

In any event, you don't have to worry about copies of the actual data being
created and passed back.
 
M

Mike Labosh

A function's return value can't be ByRef or ByVal. It's just what it
returns. Now, the parameters that go into the function can be ByRef or
ByVal.

That's what I was afraid of. Oh well, you win some, you lose some. I was
just hoping to squeak a little more performance out of this.

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"
 
M

Mythran

Mike Labosh said:
That's what I was afraid of. Oh well, you win some, you lose some. I was
just hoping to squeak a little more performance out of this.

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"

One way to squeak a little more performance is to read/write only what you
need. Instead of loading all data into a data table or data set, you can
load the strings you need into strings, manipulate what you need, write to
the store. If you are using files, read only what you need into a string,
manipulate it, and write it back out. It sounds as though you are loading
from a database, in this case, do you really need to do all of the
manipulation using client code? Just for kicks, and to see if we can speed
this up a lot, post a little of the logic you are using (code) for
manipulating the data. It might be possible to do all this using SQL
Server, which turns out to be a lot faster for manipulating data in the
database (go figure, a database is faster at manipulating data?!? :p )

Mythran
 
J

Jay B. Harlow [MVP - Outlook]

Mike,
In addition to the other comments.

I would define the function as:

| Public Function CleanSomething(ByVal value As String) As String

To help ensure the "fastest" possible function! Remember that ByVal & ByRef
refer to how parameters are passed, while Reference Type & Value Type refer
to how values are stored.

ByVal passes a copy of the variable as the parameter.
ByRef passes a reference to the variable as the parameter.

Reference Types exist on the heap, a variable holds a reference to the
actual object on the heap.
Value Types exist on the stack or nested inside another object, a variable
holds the actual value.


String is a Reference type, which means that a String variable or parameter
holds a reference to the actual string object on the Heap. If you pass a
String ByRef to a routine, you are passing a reference to the variable that
holds a reference to the actual string object on the heap. In other words a
reference to a reference to an object. If you pass a String ByVal you
passing the reference itself. In other words a reference to an object.

I would expect ByRef String to be slightly slower as you are dereferencing a
reference each time you want to access the String's value.

When you define your function "As String" you are receiving a copy of the
reference to the actual string object on the heap. There is only one
instance of the String on the heap.

Hope this helps
Jay

| >I would first suggest that you use a StringBuilder, rather than Strings
for
| >heavy string manipulation.
|
| Actually, most of the stuff uses Regex's. But I do use StringBuilder
where
| I can. StringBuilder let me do one of our export batches in half the time
| it used to take :):):)
|
| > Second, what is your function returning? If it returns a Reference Type,
| > then you are only getting a copy of the pointer to the reference type,
not
| > a copy of the reference type itself.
|
| Pretty much all the method prototypes in this class look like this:
|
| Public Function CleanSomething(ByRef value As String) As String
|
| There is one method that returns a Structure, also.
|
| I just want to make sure I'm returning the return value ByRef for greater
| speed / efficiency.
|
| --
| Peace & happy computing,
|
| Mike Labosh, MCSD
|
| "Mr. McKittrick, after very careful consideration, I have
| come to the conclusion that this new system SUCKS."
| -- General Barringer, "War Games"
|
|
 
S

Scott M.

"If you pass a String ByVal you
passing the reference itself. In other words a reference to an object."

Just a little clarification here, you are actually passing a COPY of the
original reference to the object, not the original reference itself.

Sub One()
Dim y As String = "Test"
Two(y)
End Sub

Sub Two(ByVal x as String)
'The parameter "x" is a copy of the pointer "y" that points to the
String object on the heap.
'There are now two pointers that point to the one String object
'Only the "x" pointer can be used in this procedure, and only the "y"
pointer can be used in the "One" procedure.
End Sub
 
G

Guest

If I pass a structure byval that contains both reference and value types,
what exactly am I passing and if I change a structure field in my function,
is the structure field in the calling procedure changed also?
 
S

Scott M.

Structures are Value Types. If you pass a Value Type ByVal, you get a copy
of the structure. Changes to the passed structure do not affect the
original structure.
 
J

Jay B. Harlow [MVP - Outlook]

Dennis,
| If I pass a structure byval that contains both reference and value types,
| what exactly am I passing
A structure is a value type, you are receiving a copy of all the values. If
the structure contains a String field, you get a copy of the reference to a
single copy of the String object on the heap.

| if I change a structure field in my function,
| is the structure field in the calling procedure changed also?
You are changing your copy of the structure values, not the original.

Hope this helps
Jay

| If I pass a structure byval that contains both reference and value types,
| what exactly am I passing and if I change a structure field in my
function,
| is the structure field in the calling procedure changed also?
| --
| Dennis in Houston
|
|
| "Jay B. Harlow [MVP - Outlook]" wrote:
|
| > Mike,
| > In addition to the other comments.
| >
| > I would define the function as:
| >
| > | Public Function CleanSomething(ByVal value As String) As String
| >
| > To help ensure the "fastest" possible function! Remember that ByVal &
ByRef
| > refer to how parameters are passed, while Reference Type & Value Type
refer
| > to how values are stored.
| >
| > ByVal passes a copy of the variable as the parameter.
| > ByRef passes a reference to the variable as the parameter.
| >
| > Reference Types exist on the heap, a variable holds a reference to the
| > actual object on the heap.
| > Value Types exist on the stack or nested inside another object, a
variable
| > holds the actual value.
| >
| >
| > String is a Reference type, which means that a String variable or
parameter
| > holds a reference to the actual string object on the Heap. If you pass a
| > String ByRef to a routine, you are passing a reference to the variable
that
| > holds a reference to the actual string object on the heap. In other
words a
| > reference to a reference to an object. If you pass a String ByVal you
| > passing the reference itself. In other words a reference to an object.
| >
| > I would expect ByRef String to be slightly slower as you are
dereferencing a
| > reference each time you want to access the String's value.
| >
| > When you define your function "As String" you are receiving a copy of
the
| > reference to the actual string object on the heap. There is only one
| > instance of the String on the heap.
| >
| > Hope this helps
| > Jay
| >
| > | > | >I would first suggest that you use a StringBuilder, rather than
Strings
| > for
| > | >heavy string manipulation.
| > |
| > | Actually, most of the stuff uses Regex's. But I do use StringBuilder
| > where
| > | I can. StringBuilder let me do one of our export batches in half the
time
| > | it used to take :):):)
| > |
| > | > Second, what is your function returning? If it returns a Reference
Type,
| > | > then you are only getting a copy of the pointer to the reference
type,
| > not
| > | > a copy of the reference type itself.
| > |
| > | Pretty much all the method prototypes in this class look like this:
| > |
| > | Public Function CleanSomething(ByRef value As String) As String
| > |
| > | There is one method that returns a Structure, also.
| > |
| > | I just want to make sure I'm returning the return value ByRef for
greater
| > | speed / efficiency.
| > |
| > | --
| > | Peace & happy computing,
| > |
| > | Mike Labosh, MCSD
| > |
| > | "Mr. McKittrick, after very careful consideration, I have
| > | come to the conclusion that this new system SUCKS."
| > | -- General Barringer, "War Games"
| > |
| > |
| >
| >
| >
 
C

Cor Ligthert

Jay,
I would expect ByRef String to be slightly slower as you are dereferencing
a
reference each time you want to access the String's value.
Can you give us how many picoseconds on a 2Ghz Intel P4 computer with dual
channels.

:))

Cor
 
J

Jay B. Harlow [MVP - Outlook]

Cor,
I did say *slightly* slower! ;-)

Jay

| Jay,
|
| >
| > I would expect ByRef String to be slightly slower as you are
dereferencing
| > a
| > reference each time you want to access the String's value.
| >
| Can you give us how many picoseconds on a 2Ghz Intel P4 computer with dual
| channels.
|
| :))
|
| Cor
|
|
 
M

Mike Labosh

Can you give us how many picoseconds on a 2Ghz Intel P4 computer with dual
channels.

Go ahead and make fun all you want. If I can save a picosecond on each
iteration of this giant loop, running on a 4-CPU server, I will :)

--
Peace & happy computing,

Mike Labosh, MCSD

"Mr. McKittrick, after very careful consideration, I have
come to the conclusion that this new system SUCKS."
-- General Barringer, "War Games"
 

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

Similar Threads

Object Browser Descriptions 3
Does it have unicode? 2
BHO Disabler 4
Maximum Row Count 4
Import .DAT file 2
DataTable Bizarreness 4
iexplore.exe bizarreness 2
Regex Issues 7

Top