Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C: performance of assignments, binary operations, et cetera

Tags:

performance

c

I've heard many things about performance in C; casting is slow compared to normal assignments, functional call is slow, binary operation are much faster than normal operations, et cetera...

I'm sure some of those things are specific to the architecture, and compiler optimization might make a huge difference, but I would like to see a chart to get a general idea what I should do and what I should avoid to write high-performance programs. Is there such a chart (or a website, a book, anything) ?

like image 659
Suugaku Avatar asked May 22 '10 21:05

Suugaku


2 Answers

Basically, no. There is no such "tips and tricks" book from the syntax level, because there is no sure-fire guarantee that anything you stated is true (in fact, most of it is false).

In general, performance tuning should focus more on algorithms, followed by memory locality and cache optimizations. The best tools you will have are profilers (oprofile, valgrind, cachegrind, etc) followed by an understanding of machine architecture (instructions combinations which are suboptimal, alignment restrictions, memory hierarchy and size) and assembly language for your CPU (to catch less than optimal inner loop problems).

If you are interested in micro-optimizations on the Intel architecture (and all Intel compatible CPUs), this is a must read (PDF). There are more interesting guides on Agner's website.

like image 176
Yann Ramin Avatar answered Nov 15 '22 11:11

Yann Ramin


It seems to me that you're very confused by all this. Let's address some of these myths that you've dragged up.

Casting is slow compared to normal assignments.

That really depends on what you're casting. Between different address types, no; casting is actually free there as you're just applying a different interpretation to the same value. Casting between different widths of numeric type can be a bit slower (and sometimes is done implicitly on assignment) but is still very fast.

Function calls are slow.

Not really. They're not free, but the cost is not high enough that you should avoid them unless you've got profiling data that says otherwise. Never optimize without a very good reason to do so and proof that it will help. (For the record I've been known to revert attempted optimizations that did not have the balance of performance gains I wanted.)

Binary operations are faster than normal operations.

What's a “normal operation”? FWIW, addition is a binary operation. So is multiplication. On modern hardware, they're both pretty fast. Let the compiler worry about that. It's far more important that you focus on describing what you're doing correctly.

Now, for things that really cost:

  • I/O.
  • Memory allocation.
  • Memory copies.
  • Deeply nested (or very long) loops.

Keep your eyes on those; they're where software usually gets slow. And always pick good algorithms and data structures.

like image 44
Donal Fellows Avatar answered Nov 15 '22 10:11

Donal Fellows