View Class Clusters
As of iOS 11/macOS High Sierra, and only including ones in Foundation and CoreFoundation | |
Strings: | |
_NSCFString - a CFStringRef or CFMutableStringRef. This is the most common type of string object currently. | |
- May have 8 bit (ASCII) or 16 bit (UTF-16) backing store | |
_NSCFConstantString - a compile time constant CFStringRef, like you'd get with @"foo" | |
- May also be generated by dynamic string creation if matches a string in a pre-baked table of common strings called the StringROM | |
NSBigMutableString - an NSString backed by a CFStorage (https://github.com/opensource-apple/CF/blob/master/CFStorage.h) for faster handling of very large strings | |
NSCheapMutableString - a very limited NSMutableString that allows for zero-copy initialization. Used in NSFileManager for temporarily wrapping stack buffers. |
View refcounting.m
#import <Foundation/Foundation.h> | |
#import <time.h> | |
#define USE_CF_NONOBJC 1 | |
#if USE_CF_NONOBJC | |
extern CFTypeRef _CFNonObjCRetain(CFTypeRef cf); | |
extern void _CFNonObjCRelease(CFTypeRef cf); | |
#endif |
View Caches
Let's Reinvent Modern CPU Caches! | |
In The Beginning, programs were hard-coded, entered directly with switches. Values would be input, and then results would output, | |
but couldn't really be stored. We'll draw this like so: | |
Input -> Fixed Calculations -> Output | |
An early improvement in generality was the addition of storage (ENIAC eventually gained 100 words of magnetic core memory), | |
leaving us with something along these lines: |
View sethack.m
// Compile with clang -framework Foundation sethack.m | |
#import <Foundation/Foundation.h> | |
#import <objc/runtime.h> | |
/* | |
CFHashBytes from http://www.opensource.apple.com/source/CF/CF-1153.18/CFUtilities.c | |
*/ | |
#define ELF_STEP(B) T1 = (H << 4) + B; T2 = T1 & 0xF0000000; if (T2) T1 ^= (T2 >> 24); T1 &= (~T2); H = T1; |
View inline.m
#import <Foundation/Foundation.h> | |
#import <assert.h> | |
//Compile with `clang -Os -framework Foundation -fno-objc-arc inlinestorage.m -o inline, run with `inline clever` or `inline naive` | |
/* | |
NaiveArray implements a simple immutable NSArray-like interface in probably the most obvious way: store a pointer to a C array of objects | |
*/ | |
@interface NaiveArray : NSObject { | |
NSUInteger count; |
View malloccliff.c
#import <stdlib.h> | |
#import <malloc/malloc.h> | |
#define SLOW 1 | |
int main(int argc, const char * argv[]) { | |
#if SLOW | |
int sizes[] = { 256032, 512032, 1024032, 1792032 }; | |
for (int ii = 0; ii < 10000; ii++) { |
View benchmarkcompare.swift
/* | |
Shell version: | |
paste -d , oldoutput.txt output.txt | awk -F "," '{printf "%s %s %s %f\n", $2, $8, $16, $8 / $16}' | sort -k4 | egrep -v "(1\.0|0\.9[1-9])" | |
*/ | |
import Foundation | |
// "paste -d , oldfile.txt newfile.txt" | |
let paths = CommandLine.arguments[1...2].map(URL.init(fileURLWithPath:)) |
View localcomputedinout.swift
func g(_ x: inout Int) { | |
x = x * x | |
} | |
func f() { | |
var computed:Int { | |
get { return 5 } | |
set { print(newValue) } | |
} | |
g(&computed) |
View failbuzz.m
//compile with "clang -framework Foundation -arch i386 failbuzz.m -o FizzBuzz" | |
//Yes, it only works in 32 bit | |
//No, I can't fix it to work correctly past 12 without coming up with a new implementation strategy, | |
//or compiling a new CoreFoundation that caches more CFNumbers (…I did do that to be sure it worked though) | |
#import <Foundation/Foundation.h> | |
#import <libgen.h> | |
static void setup(const char * argv[]) { | |
for (int i = 1; i <= 100; i++) { |
View tollfree.m
//Given this: | |
NSArray *objects = @[@1, @2, @3] | |
//These are equivalent in behavior | |
NSNumber *first = [objects objectAtIndex:0] | |
NSNumber *second = (NSNumber *)CFArrayGetValueAtIndex(objects, 0) | |
//But is the code that runs the same? Not so much… in the first one we do… | |
objc_msgSend(objects, <selector reference>, 0) | |
-> http://sealiesoftware.com/msg/x86-mavericks.html |
NewerOlder