Some performance questions
grauzone
none at example.net
Mon Feb 2 10:27:28 PST 2009
Jarrett Billingsley wrote:
> On Mon, Feb 2, 2009 at 8:31 AM, Lars Kyllingstad
> <public at kyllingen.nospamnet> wrote:
>> I have some functions for which I want to find the nicest possible
>> combination of performance and usability. I have two suggestions as to how
>> they should be defined.
>>
>> "Classic" style:
>>
>> real myFunction(real arg, int someParam, inout real aReturnValue)
>> {
>> declare temporary variables;
>> do some calculations;
>> store a return value in aReturnValue;
>> return main return value;
>> }
>>
>> The user-friendly way, where the function is encapsulated in a class:
>>
>> class MyFunctionWorkspace
>> {
>> declare private temporary variables;
>>
>> real anotherReturnValue;
>>
>> this (int someParam)
>> { ... }
>>
>> real myFunction(real arg)
>> {
>> do some calculations;
>> store a return value in aReturnValue;
>> return main return value;
>> }
>> }
>>
>> I'm sure a lot of people will disagree with me on this, but let me first say
>> why I think the last case is more user-friendly. For one thing, the same
>> class can be used over and over again with the same parameter(s). Also, the
>> user only has to retrieve aReturnValue if it is needed. If there are many
>> such "additional" inout parameters which are seldom needed, it gets tedious
>> to declare variables for them every time the function is called. I could
>> overload the function, but this also has drawbacks if there are several
>> inout parameters with the same type.
>>
>> My questions are:
>>
>> - If I do like in the second example above, and reuse temporary variables
>> instead of allocating them every time the function is called, could this way
>> also give the best performance? (Yes, I know this is bad form...)
>>
>> ...or, if not...
>>
>> - If I (again in the second example) move the temporary variables inside the
>> function, so they are allocated on the stack instead of the heap (?), will
>> this improve or reduce performance?
>>
>> I could write both types of code and test them against each other, but I am
>> planning to use the same style for several different functions in several
>> modules, and want to find the solution which is generally the best one.
>
> Any gains you get from skipping the initial calculations will be
> swiftly cut down by the cost of heap allocation and cache misses, if
> you allocate this object several times.
>
> A much better way to get the usability of the latter with the better
> performance of the former is to use a struct instead of a class. I
> highly doubt you'll be needing to inherit these "operation objects"
> anyway. The struct will be allocated on the stack, and you still get
> all the usability.
Why not use scope to allocate the class on the stack?
For everything else, I agree with Donald Knuth (if he really said that...)
More information about the Digitalmars-d-learn
mailing list