While programming optimization that makes ones' code completely unreadable is often a bad thing, there are places for it, like that one inner loop of your code that takes up 98% of the program's running time.
What are you tricks for improving performance in C, other than the obvious inline assembly or the like?
Name:
Anonymous2007-09-17 8:42 ID:p/yux4n8
>>79
Moar like: while (condition1) {
...code...
if (OMG_DISASTROUS_CONDITION) {
break;
}
...code...
}
simpler, easier to read and less error-prone (due to no condition repeated) than:
while (condition1 && !OMG_DISASTROUS_CONDITION) {
...code...
if (!OMG_DISASTROUS_CONDITION) {
...code that's actually at the same conceputal level than the other block but appears indented...
}
} //}} is alright, but nicer if it can be avoided
>>80
incorrect.
"literal strings" are arrays of N length.
Name:
Anonymous2007-09-17 9:06 ID:nNPi4cfO
clearly, the EXPERT PROGRAMMER wouldn't use c in the first place.
better to use java, to produce ENTEPRISE LEVEL, fully scalable, reductible, end-user optimized professional applications.
Why is that? Is it because adding 8 to (subtracting 8 from, depending on your architecture) your stack pointer is more expensive than adding/subtracting 4?
1. Use fprintf ("fast printf") instead of printf.
2. ++i is faster than both i++ and i = i + 1.
3. void main(void) is faster than int main(void) or int main(int, char **) since no value needs to be returned to the OS.
4. Swapping with exclusive-or (a^=b^=a^=b swaps a and b) is faster than using a temporary. This works for all types (including structures), but not on all compilers. Some compilers may also give you a harmless warning.
5. Static storage duration objects are faster than automatic storage duration objects because the CPU doesn't have to set aside storage on the stack every time a function is called. Make your loop indexes global so that you can use them everywhere: int i;
void func(void) { for (i = 0; i < 10; i++) ; /* ... */ }
void func2(void) { for (i = 0; i < 20; i++) ; /* ... */ }
/* ... */
6. Compilers often give more memory to arrays than you asked for. Here's how to check how big an array actually is (memset returns a null pointer if the size you passed to it is bigger than the size of the array you passed to it): int arr[256];
size_t realsize;
for (realsize = 0; realsize <= SIZE_MAX; ++realsize)
if (!memset(arr, 0, realsize)) break;
/* now you know that arr actually has realsize / sizeof (int) elements */
If you combine this with #5, your program will be faster in the long run (but this usually doesn't work for short programs).
Also remember the remark, that is "rm", tool in your UNIX shell.
Name:
Anonymous2007-12-30 6:59
are we talking compilation optimization or code execution? because i don't really care how fast the compile is, in my case i've so far only written applications that compile in a few seconds or less
so what tips do you have for optimizing executable code when you compile with gcc and link with ld to the bsd libc?
Name:
Anonymous2007-12-30 7:33
strip -R.data binary
Name:
Anonymous2007-12-30 13:50
>>102
Don't forget to use -fr, which means fold previous remarks you've made with the new ones. Otherwise you'll erase your old comments! For example:
$ rm -fr ~/ This is my home directory
... will attach the remark "This is my home directory" to ~/, leaving any previous remarks intact.
Also, to view remarks you've made previously, try the -v option:
>>100 6. Compilers often give more memory to arrays than you asked for. Here's how to check how big an array actually is (memset returns a null pointer if the size you passed to it is bigger than the size of the array you passed to it): O HI I UPGRADED UR ALGORITHM! #include <stdlib.h>
#include <stdio.h>
char* main() {
char* DATA = malloc(4097);
printf("%u\n", *(unsigned int*)(DATA - 4));
return DATA; /* ONLY PUSSEYS FREE THERE MEMORT; LET THE DOS DO IT!!! */
}
Name:
Anonymous2008-01-08 10:56
>>11
But which is faster? Three XOR instructions or three MOV's using a temporary register?
#define iswap(x,y) (do uintptr_t __x=x,x=y,y=__x; while(0))
#define pswap(p,s) (do void *__p=p,p=s,s=__p; while(0))
#define fswap(f,g) (do long double __f=f,f=g,g=__f; while(0))
Name:
Anonymous2008-01-08 12:20
>>117
That looks NP-complete to me... or kind of like Perl... but I think parsing Perl is NP-complete.