roovent

Function Calling Comparison

Aug 1st, 2018
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Code in this article:
  2. // https://it.toolbox.com/blogs/hohlecow/bypassing-objective-cs-message-passing-mechanism-for-speed-052708
  3.  
  4. #import <Cocoa/Cocoa.h>
  5. @interface Fib : NSObject {
  6. }
  7. - (long long) messageFib: (NSUInteger) number;
  8. - (long long) impFib: (NSUInteger) number;
  9. - (long long) cFib: (NSUInteger) number;
  10. @end
  11.  
  12. @implementation Fib
  13.  
  14. // message passing implementation of fib
  15. - (long long) messageFib: (NSUInteger) number {
  16.     return (number < 3) ? 1 : [self messageFib: number - 1] + [self messageFib: number - 2];
  17. }
  18.  
  19. // imp implementation of fib
  20. - (long long) impFib: (NSUInteger) number {
  21.     static long long (*impFibIMP)(id, SEL, NSUInteger) = nil;
  22.     if (!impFibIMP) {
  23.         impFibIMP = (long long (*)(id, SEL, NSUInteger)) [self methodForSelector: _cmd];
  24.     }
  25.     return (number < 3) ? 1 : impFibIMP(self, _cmd, number - 1) + impFibIMP(self, _cmd, number - 2);
  26. }
  27.  
  28. // c implementation of fib
  29. long long cFib(NSUInteger number) {
  30.     return (number < 3) ? 1 : cFib(number - 1) + cFib(number - 2);
  31. }
  32.  
  33. // method wrapper for c implementation of fib
  34. - (long long) cFib: (NSUInteger) number {
  35.     return cFib(number);
  36. }
  37.  
  38. @end
Advertisement