Swiftgram/Tests/ASPerformanceTestContext.m
appleguy 465abb1ded [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses). (#1077)
* [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses)

With permission of the Facebook Open Source team, we are simplifying the Texture
license so that clients can rely on the Apache 2 terms that most of Texture is
already covered by. This means that code originally forked from AsyncDisplayKit
will be re-licensed from "BSD 3-clause + PATENTS v2" to Apache 2 without a
PATENTS file.

After getting confirmation that the updates to these core files look good, we'll
propagate this new license header to all files (in this same PR) and get sign-off
from all parties before landing.

* [License] Update all Texture source files to be pure Apache 2.

* Changelog entry for Apache 2 license update.

* Revert "[License] Update all Texture source files to be pure Apache 2."

This reverts commit ffa0fbbba9717d871dd16c4b07539f2f8208fc2b.

* [License] Update all Texture source files to be pure Apache 2, maintaining copyrights.

* [License] Update CONTRIBUTING, README, Podspec & Dangerfile.
2018-08-28 07:39:18 -07:00

128 lines
3.7 KiB
Objective-C

//
// ASPerformanceTestContext.m
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#import <Foundation/Foundation.h>
#import "ASPerformanceTestContext.h"
#import <AsyncDisplayKit/ASAssert.h>
@interface ASPerformanceTestResult ()
@property (nonatomic) NSTimeInterval timePer1000;
@property (nonatomic) NSString *caseName;
@property (nonatomic, getter=isReferenceCase) BOOL referenceCase;
@property (nonatomic) float relativePerformance;
@end
@implementation ASPerformanceTestResult
- (instancetype)init
{
self = [super init];
if (self != nil) {
_userInfo = [[NSMutableDictionary alloc] init];
}
return self;
}
- (NSString *)description
{
NSString *userInfoStr = [_userInfo.description stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
return [NSString stringWithFormat:@"<%-20s: time-per-1000=%04.2f rel-perf=%04.2f user-info=%@>", _caseName.UTF8String, _timePer1000, _relativePerformance, userInfoStr];
}
@end
@implementation ASPerformanceTestContext {
NSMutableDictionary *_results;
NSInteger _iterationCount;
ASPerformanceTestResult * _Nullable _referenceResult;
}
- (instancetype)init
{
self = [super init];
if (self != nil) {
_iterationCount = 1E4;
_results = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)dealloc
{
/**
* I know this seems wacky but it's a pain to have to put this in every single test method.
*/
NSLog(@"%@", self.description);
}
- (BOOL)areAllUserInfosEqual
{
ASDisplayNodeAssert(_results.count >= 2, nil);
NSEnumerator *resultsEnumerator = [_results objectEnumerator];
NSDictionary *userInfo = [[resultsEnumerator nextObject] userInfo];
for (ASPerformanceTestResult *otherResult in resultsEnumerator) {
if ([userInfo isEqualToDictionary:otherResult.userInfo] == NO) {
return NO;
}
}
return YES;
}
- (void)addCaseWithName:(NSString *)caseName block:(AS_NOESCAPE ASTestPerformanceCaseBlock)block
{
ASDisplayNodeAssert(_results[caseName] == nil, @"Already have a case named %@", caseName);
ASPerformanceTestResult *result = [[ASPerformanceTestResult alloc] init];
result.caseName = caseName;
result.timePer1000 = [self _testPerformanceForCaseWithBlock:block] / (_iterationCount / 1000);
if (_referenceResult == nil) {
result.referenceCase = YES;
result.relativePerformance = 1.0f;
_referenceResult = result;
} else {
result.relativePerformance = _referenceResult.timePer1000 / result.timePer1000;
}
_results[caseName] = result;
}
/// Returns total work time
- (CFTimeInterval)_testPerformanceForCaseWithBlock:(AS_NOESCAPE ASTestPerformanceCaseBlock)block
{
__block CFTimeInterval time = 0;
for (NSInteger i = 0; i < _iterationCount; i++) {
__block CFTimeInterval start = 0;
__block BOOL calledStop = NO;
@autoreleasepool {
block(i, ^{
ASDisplayNodeAssert(start == 0, @"Called startMeasuring block twice.");
start = CACurrentMediaTime();
}, ^{
time += (CACurrentMediaTime() - start);
ASDisplayNodeAssert(calledStop == NO, @"Called stopMeasuring block twice.");
ASDisplayNodeAssert(start != 0, @"Failed to call startMeasuring block");
calledStop = YES;
});
}
ASDisplayNodeAssert(calledStop, @"Failed to call stopMeasuring block.");
}
return time;
}
- (NSString *)description
{
NSMutableString *str = [NSMutableString stringWithString:@"Results:\n"];
for (ASPerformanceTestResult *result in [_results objectEnumerator]) {
[str appendFormat:@"\t%@\n", result];
}
return str;
}
@end