• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Referencing struct fields in C
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Referencing struct fields in C


  • Subject: Re: Referencing struct fields in C
  • From: Oleg Krupnov <email@hidden>
  • Date: Mon, 30 May 2011 16:30:22 +0300

> In any case, the optimizer will probably move all of the loop-invariant state outside the loop for you, and it's likely to do a better job than your home-grown attempt.

That's a great news! If it is really so, I stand corrected and not
trying to optimize it any further.

In fact, in the meantime I created a quick and dirty prototype to
measure this operation isolated, and it seems that out of 3 options
(plain if, function pointer, and pointer arithmetics) the plain if is
the winner, surprisingly :)

I also agree with what you said about negligibility of this
optimization compared to the rest of code. It's just sometimes hard to
stop nit-picking where you think you can optimize something, you know
:)

One thing that bothers me though. How the compiler will understand
that the state is loop-invariant? Should I necessarily declare the
checked boolean state as a local stack variable (unlike to a class
member variable that may change as a side-effect, if foo() was a class
method)?

for example
- (void)foo
{
   bool xOrY = m_isXOrY;
   for (int i = 0; i < N; ++i)
  {
     if (xOrY)
     {
         int value = a[i].y;
          ...
     }
     else
     {
         int value = a[i].y;
         ...
     }
  }
}

Would this suffice?

Thanks!

On Mon, May 30, 2011 at 4:14 PM, Graham Cox <email@hidden> wrote:
>
> On 30/05/2011, at 10:26 PM, Oleg Krupnov wrote:
>
>> I knew this question was coming! :) Well, maybe you are right. The
>> problem is that the function foo() involves much stuff, including disk
>> I/O operations, so measuring its performance is quite tricky, you get
>> different result on each test, depending on the available memory, disk
>> busyness etc. It's hard to make a clean experiment. Generally, the
>> foo() needs to be as fast as possible, because it is already long
>> lasting. I have been optimizing foo() before, and now I need to make
>> only a small change (choose x or y), and I am lazy to bother with
>> profiling again, I just wanted to make the most optimal possible thing
>> up front. Maybe it's just nit-picking... But I became curious if the
>> above idea would be feasible at all!
>
>
> This suggests that the optimisation you're contemplating is not going to be worthwhile. The tiny gains you might see due to eliminating one test-and-branch per loop are going to be swamped massively by these other things going on. It's not a case of not making a clean experiment, it's not going to be measurable*. In any case, the optimizer will probably move all of the loop-invariant state outside the loop for you, and it's likely to do a better job than your home-grown attempt.
>
> That said, I'm not sure how portable it is, but you could use offsetof() instead of pointer arithmetic, which is always a risky business.
>
> *Let's put some hypothetical numbers on this. Suppose your loop on its own, doing nothing else, takes 1mS. Your optimisation goes in and hey-presto, it takes 0.5mS. That looks great, a 100% improvement. Now add in all the "real world" code that has to be executed. It now takes 5 seconds. The 0.5mS you got is now a 0.01% improvement. QED.
>
> --Graham
>
>
>
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Referencing struct fields in C
      • From: Graham Cox <email@hidden>
References: 
 >Referencing struct fields in C (From: Oleg Krupnov <email@hidden>)
 >Re: Referencing struct fields in C (From: Oleg Krupnov <email@hidden>)
 >Re: Referencing struct fields in C (From: Graham Cox <email@hidden>)
 >Re: Referencing struct fields in C (From: Oleg Krupnov <email@hidden>)
 >Re: Referencing struct fields in C (From: Graham Cox <email@hidden>)

  • Prev by Date: How to call delegate methods using YouTube embed technique?
  • Next by Date: Re: Why does NSArray count return NSUInteger?
  • Previous by thread: Re: Referencing struct fields in C
  • Next by thread: Re: Referencing struct fields in C
  • Index(es):
    • Date
    • Thread