4 ms·
I don't like it. You should put the logic where the logic should be, so it's clear to see what was intended. typedef int (*MethodFunc)(); void doMetho
by vortico 8y ago
I don't like it. You should put the logic where the logic should be, so it's clear to see what was intended.
typedef int (*MethodFunc)();
void doMethod() {
static int methodId = 0;
static const MethodFunc methodFuncs[] = {
#ifdef METHOD_1_CAN_COMPILE
method1,
#endif
method2,
...,
NULL
};
while (methodFuncs[methodId]) {
int success = (methodFuncs[methodId])();
if (success)
return 0;
methodId++;
}
return -1;
}
- blux 8y agoIn case performance is all you are after, this has much less potential for inlining than the rsync implementation has.
- vortico 8y agoTrue, but for rsync's case of setting the mtime of a file, performance of this logic is utterly insignificant.
- bayindirh 8y ago"Everything is fast for small n." -Knuth. While syncing some million files, I'm sure it'll have an impact tho. P.S.: Yes, we use it for a million files, regularly.
- blibble 8y agoit's probably not noticeable for a million files the syscall is going to be many, many orders of magnitude slower than the difference between a direct and an indirect call
- vortico 8y agoWith trivial method() functions, you could speed through that loop a million times in a millisecond.
- bayindirh 8y agoIIRC, switch statements bigger than a certain sizes are compiled to jump tables. So it's just a static jump after the code finds a working method. In theory, it's a very cheap piece of assembly after that point.
- stouset 8y agoIf all of the methodFuncs fail, this will attempt to jump to whatever address happens to be in memory after the last element of methodFuncs. You've forgotten to stop iterating.
- ahoka 8y agoThere is a terminating NULL at the end of the array to stop the iteration.
- jbverschoor 8y agooh my... that never went wrong
- dsamarin 8y agoA terminating null element or logical equivalent in an array is helpful in lots of situations. As one example it simplifies the logic of looking for an element in an array and performing some special operation if it was not found. No bool found variable necessary.
- jbverschoor 8y agoWell yes, but it can easily be removed by accident, and is easy to oversee. See the parent comment
- deleted 8y ago[deleted]