X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_transform/misc/speed-test.mm diff --git a/Security/libsecurity_transform/misc/speed-test.mm b/Security/libsecurity_transform/misc/speed-test.mm new file mode 100644 index 00000000..b33aea64 --- /dev/null +++ b/Security/libsecurity_transform/misc/speed-test.mm @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2010 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + + +#import "speed-test.h" +#include "SecTransform.h" +#include "SecExternalSourceTransform.h" +#include "SecNullTransform.h" +#include + +@implementation speed_test + +@end + +UInt8 zeros[1024]; + +typedef void (^push_block_t)(CFDataRef d); + +void timed_test(NSString *name, float seconds, SecTransformRef tr, push_block_t push) { + __block int num_out = 0; + __block int num_in = 0; + __block int timeout_out = -1; + __block int timeout_in = -1; + volatile __block bool done; + static CFDataRef z = CFDataCreateWithBytesNoCopy(NULL, zeros, sizeof(zeros), NULL); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, static_cast(seconds * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + done = true; + timeout_out = num_out; + timeout_in = num_in; + }); + + dispatch_group_t dg = dispatch_group_create(); + dispatch_group_enter(dg); + + dispatch_queue_t q = dispatch_queue_create("counter", NULL); + + SecTransformExecuteAsync(tr, q, ^(CFTypeRef message, CFErrorRef error, Boolean isFinal) { + if (message) { + num_out++; + } + if (error) { + NSLog(@"Error %@ while running %@", error, name); + } + if (isFinal) { + dispatch_group_leave(dg); + } + }); + + while (!done) { + push(z); + num_in++; + } + push(NULL); + dispatch_group_wait(dg, DISPATCH_TIME_FOREVER); + NSString *m = [NSString stringWithFormat:@"%@ %d in, %d out times in %f seconds, %d stragglers\n", name, timeout_in, timeout_out, seconds, num_out - timeout_out]; + [m writeToFile:@"/dev/stdout" atomically:NO encoding:NSUTF8StringEncoding error:NULL]; +} + +int main(int argc, char *argv[]) { + NSAutoreleasePool *ap = [[NSAutoreleasePool alloc] init]; + float seconds = 5.0; + + { + SecTransformRef x = SecExternalSourceTransformCreate(NULL); + //SecTransformRef t = SecEncodeTransformCreate(kSecBase64Encoding, NULL); + SecTransformRef t = SecNullTransformCreate(); + SecTransformRef g = SecTransformCreateGroupTransform(); + assert(x && t && g); + SecTransformConnectTransforms(x, kSecTransformOutputAttributeName, t, kSecTransformInputAttributeName, g, NULL); + + timed_test(@"external source", seconds, t, ^(CFDataRef d){ + SecExternalSourceSetValue(x, d, NULL); + }); + + } + + // This second test has issues with the stock transform framwork -- it don't think the graph is valid (missing input) + { + //SecTransformRef t = SecEncodeTransformCreate(kSecBase64Encoding, NULL); + SecTransformRef t = SecNullTransformCreate(); + assert(t); + + timed_test(@"set INPUT", seconds, t, ^(CFDataRef d){ + SecTransformSetAttribute(t, kSecTransformInputAttributeName, d, NULL); + }); + } +}