|
@@ -64,6 +64,112 @@ static const uint32_t kRepeatedCount = 100;
|
|
}];
|
|
}];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+- (void)testMessageSerialParsingPerformance {
|
|
|
|
+ // This and the next test are meant to monitor that the parsing functionality of protos does not
|
|
|
|
+ // lock across threads when parsing different instances. The Serial version of the test should run
|
|
|
|
+ // around ~2 times slower than the Parallel version since it's parsing the protos in the same
|
|
|
|
+ // thread.
|
|
|
|
+ TestAllTypes *allTypesMessage = [TestAllTypes message];
|
|
|
|
+ [self setAllFields:allTypesMessage repeatedCount:2];
|
|
|
|
+ NSData *allTypesData = allTypesMessage.data;
|
|
|
|
+
|
|
|
|
+ [self measureBlock:^{
|
|
|
|
+ for (int i = 0; i < 500; ++i) {
|
|
|
|
+ [TestAllTypes parseFromData:allTypesData error:NULL];
|
|
|
|
+ [TestAllTypes parseFromData:allTypesData error:NULL];
|
|
|
|
+ }
|
|
|
|
+ }];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)testMessageParallelParsingPerformance {
|
|
|
|
+ // This and the previous test are meant to monitor that the parsing functionality of protos does
|
|
|
|
+ // not lock across threads when parsing different instances. The Serial version of the test should
|
|
|
|
+ // run around ~2 times slower than the Parallel version since it's parsing the protos in the same
|
|
|
|
+ // thread.
|
|
|
|
+ TestAllTypes *allTypesMessage = [TestAllTypes message];
|
|
|
|
+ [self setAllFields:allTypesMessage repeatedCount:2];
|
|
|
|
+ NSData *allTypesData = allTypesMessage.data;
|
|
|
|
+
|
|
|
|
+ dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
|
|
|
|
+
|
|
|
|
+ [self measureBlock:^{
|
|
|
|
+ for (int i = 0; i < 500; ++i) {
|
|
|
|
+ dispatch_group_t group = dispatch_group_create();
|
|
|
|
+
|
|
|
|
+ dispatch_group_async(group, concurrentQueue, ^{
|
|
|
|
+ [TestAllTypes parseFromData:allTypesData error:NULL];
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ dispatch_group_async(group, concurrentQueue, ^{
|
|
|
|
+ [TestAllTypes parseFromData:allTypesData error:NULL];
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ dispatch_group_notify(group, concurrentQueue, ^{});
|
|
|
|
+
|
|
|
|
+ dispatch_release(group);
|
|
|
|
+ }
|
|
|
|
+ }];
|
|
|
|
+
|
|
|
|
+ dispatch_release(concurrentQueue);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)testMessageSerialExtensionsParsingPerformance {
|
|
|
|
+ // This and the next test are meant to monitor that the parsing functionality of protos does not
|
|
|
|
+ // lock across threads when parsing different instances when using extensions. The Serial version
|
|
|
|
+ // of the test should run around ~2 times slower than the Parallel version since it's parsing the
|
|
|
|
+ // protos in the same thread.
|
|
|
|
+ TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
|
|
|
|
+ [self setAllExtensions:allExtensionsMessage repeatedCount:2];
|
|
|
|
+ NSData *allExtensionsData = allExtensionsMessage.data;
|
|
|
|
+
|
|
|
|
+ [self measureBlock:^{
|
|
|
|
+ for (int i = 0; i < 500; ++i) {
|
|
|
|
+ [TestAllExtensions parseFromData:allExtensionsData
|
|
|
|
+ extensionRegistry:[self extensionRegistry]
|
|
|
|
+ error:NULL];
|
|
|
|
+ [TestAllExtensions parseFromData:allExtensionsData
|
|
|
|
+ extensionRegistry:[self extensionRegistry]
|
|
|
|
+ error:NULL];
|
|
|
|
+ }
|
|
|
|
+ }];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)testMessageParallelExtensionsParsingPerformance {
|
|
|
|
+ // This and the previous test are meant to monitor that the parsing functionality of protos does
|
|
|
|
+ // not lock across threads when parsing different instances when using extensions. The Serial
|
|
|
|
+ // version of the test should run around ~2 times slower than the Parallel version since it's
|
|
|
|
+ // parsing the protos in the same thread.
|
|
|
|
+ TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
|
|
|
|
+ [self setAllExtensions:allExtensionsMessage repeatedCount:2];
|
|
|
|
+ NSData *allExtensionsData = allExtensionsMessage.data;
|
|
|
|
+
|
|
|
|
+ dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
|
|
|
|
+
|
|
|
|
+ [self measureBlock:^{
|
|
|
|
+ for (int i = 0; i < 500; ++i) {
|
|
|
|
+ dispatch_group_t group = dispatch_group_create();
|
|
|
|
+
|
|
|
|
+ dispatch_group_async(group, concurrentQueue, ^{
|
|
|
|
+ [TestAllExtensions parseFromData:allExtensionsData
|
|
|
|
+ extensionRegistry:[UnittestRoot extensionRegistry]
|
|
|
|
+ error:NULL];
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ dispatch_group_async(group, concurrentQueue, ^{
|
|
|
|
+ [TestAllExtensions parseFromData:allExtensionsData
|
|
|
|
+ extensionRegistry:[UnittestRoot extensionRegistry]
|
|
|
|
+ error:NULL];
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ dispatch_group_notify(group, concurrentQueue, ^{});
|
|
|
|
+
|
|
|
|
+ dispatch_release(group);
|
|
|
|
+ }
|
|
|
|
+ }];
|
|
|
|
+
|
|
|
|
+ dispatch_release(concurrentQueue);
|
|
|
|
+}
|
|
|
|
+
|
|
- (void)testExtensionsPerformance {
|
|
- (void)testExtensionsPerformance {
|
|
[self measureBlock:^{
|
|
[self measureBlock:^{
|
|
for (int i = 0; i < 200; ++i) {
|
|
for (int i = 0; i < 200; ++i) {
|