ComponentKitPerfTests/CKComponentViewClassIdentifierPerfTests.mm (230 lines of code) (raw):

/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import <XCTest/XCTest.h> #import <ComponentKit/CKComponent.h> #import "CKInternalHelpers.h" #import <unordered_map> // Need enough iterations for signal #define TEST_ITERATIONS (1000 * 1000) @interface test_abcdefghijklmnopq: NSObject @end @interface test_abcdefghijklmnopqr: NSObject @end @implementation test_abcdefghijklmnopq @end @implementation test_abcdefghijklmnopqr @end @interface CKComponentViewClassIdentifierPerfTests : XCTestCase @end @implementation CKComponentViewClassIdentifierPerfTests - (void)testComponentViewClassInfo { NSLog(@"Size of std::string: %ld", sizeof(std::string)); NSLog(@"Size of std::CKComponentViewClassIdentifier: %ld", sizeof(CKComponentViewClassIdentifier)); } - (void)testPerformanceWithStdString { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { std::string s = std::string(class_getName([UIView class])); } }]; } - (void)testPerformanceWithStdStringLen22 { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { std::string s = std::string(class_getName([test_abcdefghijklmnopq class])); } }]; } - (void)testPerformanceWithStructLen22 { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { CKComponentViewClassIdentifier identifier([test_abcdefghijklmnopq class]); } }]; } - (void)testPerformanceWithStdStringLen23 { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { std::string s = std::string(class_getName([test_abcdefghijklmnopqr class])); } }]; } - (void)testPerformanceWithStructLen23 { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { CKComponentViewClassIdentifier identifier([test_abcdefghijklmnopqr class]); } }]; } - (void)testPerformanceWithStruct { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { CKComponentViewClassIdentifier identifier([UIView class]); } }]; } - (void)testPerformanceWithStdStringWithSelector { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { std::string s = std::string(class_getName([test_abcdefghijklmnopqr class])) + sel_getName(@selector(description)); } }]; } - (void)testPerformanceWithStructWithSelector { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { CKComponentViewClassIdentifier identifier([test_abcdefghijklmnopqr class], @selector(description)); } }]; } - (void)testPerformanceWithStdStringWithFunctionPointer { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { std::string s = std::string(CKStringFromPointer(0)); } }]; } - (void)testPerformanceWithStructWithFunctionPointer { [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { CKComponentViewClassIdentifier identifier((UIView *(*)(void))0); } }]; } - (void)testPerformanceAddMapWithStringKey { const std::string key = "some_key"; __block std::unordered_map<std::string, NSObject *> map; [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { map[key] = nullptr; } }]; } - (void)testPerformanceAddMapWithStructKey { const CKComponentViewClassIdentifier key = {[UIView class]}; __block std::unordered_map<CKComponentViewClassIdentifier, NSObject *> map; [self measureBlock:^{ for (auto i = 0; i < TEST_ITERATIONS; i++) { map[key] = nullptr; } }]; } - (void)testPerformanceGetRemoveFromMapWithStringKey { NSObject *value = @"Hello World"; const std::string key = "some_key"; __block std::unordered_map<std::string, NSObject *> map; __block Class *classes = nullptr; auto numClasses = objc_getClassList(NULL, 0); if (numClasses > 0 ) { classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); } for (auto i = 0; i < numClasses; i++) { map[class_getName(classes[i])] = value; } std::srand(197); [self measureBlock:^{ for (auto j = 0; j < 10; j++) { auto index = std::rand() % numClasses; auto theClass = &classes[index]; auto name = object_getClassName(*theClass); for (auto i = 0; i < TEST_ITERATIONS / 100; i++) { map.erase(name); map[name] = value; } } }]; free(classes); } - (void)testPerformanceGetFromMapWithStructKey { NSObject *value = @"Hello World"; __block std::unordered_map<CKComponentViewClassIdentifier, NSObject *> map; __block Class *classes = nullptr; auto numClasses = objc_getClassList(NULL, 0); if (numClasses > 0 ) { classes = (Class *)malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); } for (auto i = 0; i < numClasses; i++) { map[{classes[i]}] = value; } std::srand(197); [self measureBlock:^{ for (auto j = 0; j < 10; j++) { auto index = std::rand() % numClasses; auto theClass = &classes[index]; for (auto i = 0; i < TEST_ITERATIONS / 100; i++) { map.erase({*theClass}); map[{*theClass}] = value; } } }]; free(classes); } - (void)testPerformanceGetRemoveFromMapWithStringKeyWithSelector { NSObject *value = @"Hello World"; const std::string key = "some_key"; __block std::unordered_map<std::string, NSObject *> map; __block Class *classes = nullptr; auto numClasses = objc_getClassList(NULL, 0); if (numClasses > 0 ) { classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); } for (auto i = 0; i < numClasses; i++) { map[std::string(class_getName(classes[i])) + "-" + sel_getName(@selector(description))] = value; } std::srand(197); [self measureBlock:^{ for (auto j = 0; j < 10; j++) { auto index = std::rand() % numClasses; auto theClass = &classes[index]; auto name = std::string(class_getName(*theClass)) + "-" + sel_getName(@selector(description)); for (auto i = 0; i < TEST_ITERATIONS / 100; i++) { map.erase(name); map[name] = value; } } }]; free(classes); } - (void)testPerformanceGetFromMapWithStructKeyWithSelector { NSObject *value = @"Hello World"; __block std::unordered_map<CKComponentViewClassIdentifier, NSObject *> map; __block Class *classes = nullptr; auto numClasses = objc_getClassList(NULL, 0); if (numClasses > 0 ) { classes = (Class *)malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); } for (auto i = 0; i < numClasses; i++) { map[{classes[i], @selector(description)}] = value; } std::srand(197); [self measureBlock:^{ for (auto j = 0; j < 10; j++) { auto index = std::rand() % numClasses; auto key = CKComponentViewClassIdentifier {classes[index], @selector(description)}; for (auto i = 0; i < TEST_ITERATIONS / 100; i++) { map.erase(key); map[key] = value; } } }]; free(classes); } @end