Home | History | Annotate | Download | only in Tests
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2013 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #import "GPBTestUtilities.h"
     32 #import "google/protobuf/Unittest.pbobjc.h"
     33 #import "google/protobuf/UnittestImport.pbobjc.h"
     34 #import "google/protobuf/UnittestObjc.pbobjc.h"
     35 
     36 //
     37 // This file really just uses the unittests framework as a testbed to
     38 // run some simple performance tests. The data can then be used to help
     39 // evaluate changes to the runtime.
     40 //
     41 
     42 static const uint32_t kRepeatedCount = 100;
     43 
     44 @interface PerfTests : GPBTestCase
     45 @end
     46 
     47 @implementation PerfTests
     48 
     49 - (void)setUp {
     50   // A convenient place to put a break point if you want to connect instruments.
     51   [super setUp];
     52 }
     53 
     54 - (void)testMessagePerformance {
     55   [self measureBlock:^{
     56     for (int i = 0; i < 200; ++i) {
     57       TestAllTypes* message = [[TestAllTypes alloc] init];
     58       [self setAllFields:message repeatedCount:kRepeatedCount];
     59       NSData* rawBytes = [message data];
     60       [message release];
     61       message = [[TestAllTypes alloc] initWithData:rawBytes error:NULL];
     62       [message release];
     63     }
     64   }];
     65 }
     66 
     67 - (void)testExtensionsPerformance {
     68   [self measureBlock:^{
     69     for (int i = 0; i < 200; ++i) {
     70       TestAllExtensions* message = [[TestAllExtensions alloc] init];
     71       [self setAllExtensions:message repeatedCount:kRepeatedCount];
     72       NSData* rawBytes = [message data];
     73       [message release];
     74       TestAllExtensions* message2 =
     75           [[TestAllExtensions alloc] initWithData:rawBytes error:NULL];
     76       [message2 release];
     77     }
     78   }];
     79 }
     80 
     81 - (void)testPackedTypesPerformance {
     82   [self measureBlock:^{
     83     for (int i = 0; i < 1000; ++i) {
     84       TestPackedTypes* message = [[TestPackedTypes alloc] init];
     85       [self setPackedFields:message repeatedCount:kRepeatedCount];
     86       NSData* rawBytes = [message data];
     87       [message release];
     88       message = [[TestPackedTypes alloc] initWithData:rawBytes error:NULL];
     89       [message release];
     90     }
     91   }];
     92 }
     93 
     94 - (void)testPackedExtensionsPerformance {
     95   [self measureBlock:^{
     96     for (int i = 0; i < 1000; ++i) {
     97       TestPackedExtensions* message = [[TestPackedExtensions alloc] init];
     98       [self setPackedExtensions:message repeatedCount:kRepeatedCount];
     99       NSData* rawBytes = [message data];
    100       [message release];
    101       TestPackedExtensions* message2 =
    102           [[TestPackedExtensions alloc] initWithData:rawBytes error:NULL];
    103       [message2 release];
    104     }
    105   }];
    106 }
    107 
    108 - (void)testHas {
    109   TestAllTypes* message = [self allSetRepeatedCount:1];
    110   [self measureBlock:^{
    111     for (int i = 0; i < 10000; ++i) {
    112       [message hasOptionalInt32];
    113       message.hasOptionalInt32 = NO;
    114       [message hasOptionalInt32];
    115 
    116       [message hasOptionalInt64];
    117       message.hasOptionalInt64 = NO;
    118       [message hasOptionalInt64];
    119 
    120       [message hasOptionalUint32];
    121       message.hasOptionalUint32 = NO;
    122       [message hasOptionalUint32];
    123 
    124       [message hasOptionalUint64];
    125       message.hasOptionalUint64 = NO;
    126       [message hasOptionalUint64];
    127 
    128       [message hasOptionalSint32];
    129       message.hasOptionalSint32 = NO;
    130       [message hasOptionalSint32];
    131 
    132       [message hasOptionalSint64];
    133       message.hasOptionalSint64 = NO;
    134       [message hasOptionalSint64];
    135 
    136       [message hasOptionalFixed32];
    137       message.hasOptionalFixed32 = NO;
    138       [message hasOptionalFixed32];
    139 
    140       [message hasOptionalFixed64];
    141       message.hasOptionalFixed64 = NO;
    142       [message hasOptionalFixed64];
    143 
    144       [message hasOptionalSfixed32];
    145       message.hasOptionalSfixed32 = NO;
    146       [message hasOptionalSfixed32];
    147 
    148       [message hasOptionalSfixed64];
    149       message.hasOptionalSfixed64 = NO;
    150       [message hasOptionalSfixed64];
    151 
    152       [message hasOptionalFloat];
    153       message.hasOptionalFloat = NO;
    154       [message hasOptionalFloat];
    155 
    156       [message hasOptionalDouble];
    157       message.hasOptionalDouble = NO;
    158       [message hasOptionalDouble];
    159 
    160       [message hasOptionalBool];
    161       message.hasOptionalBool = NO;
    162       [message hasOptionalBool];
    163 
    164       [message hasOptionalString];
    165       message.hasOptionalString = NO;
    166       [message hasOptionalString];
    167 
    168       [message hasOptionalBytes];
    169       message.hasOptionalBytes = NO;
    170       [message hasOptionalBytes];
    171 
    172       [message hasOptionalGroup];
    173       message.hasOptionalGroup = NO;
    174       [message hasOptionalGroup];
    175 
    176       [message hasOptionalNestedMessage];
    177       message.hasOptionalNestedMessage = NO;
    178       [message hasOptionalNestedMessage];
    179 
    180       [message hasOptionalForeignMessage];
    181       message.hasOptionalForeignMessage = NO;
    182       [message hasOptionalForeignMessage];
    183 
    184       [message hasOptionalImportMessage];
    185       message.hasOptionalImportMessage = NO;
    186       [message hasOptionalImportMessage];
    187 
    188       [message.optionalGroup hasA];
    189       message.optionalGroup.hasA = NO;
    190       [message.optionalGroup hasA];
    191 
    192       [message.optionalNestedMessage hasBb];
    193       message.optionalNestedMessage.hasBb = NO;
    194       [message.optionalNestedMessage hasBb];
    195 
    196       [message.optionalForeignMessage hasC];
    197       message.optionalForeignMessage.hasC = NO;
    198       [message.optionalForeignMessage hasC];
    199 
    200       [message.optionalImportMessage hasD];
    201       message.optionalImportMessage.hasD = NO;
    202       [message.optionalImportMessage hasD];
    203 
    204       [message hasOptionalNestedEnum];
    205       message.hasOptionalNestedEnum = NO;
    206       [message hasOptionalNestedEnum];
    207 
    208       [message hasOptionalForeignEnum];
    209       message.hasOptionalForeignEnum = NO;
    210       [message hasOptionalForeignEnum];
    211 
    212       [message hasOptionalImportEnum];
    213       message.hasOptionalImportEnum = NO;
    214       [message hasOptionalImportEnum];
    215 
    216       [message hasOptionalStringPiece];
    217       message.hasOptionalStringPiece = NO;
    218       [message hasOptionalStringPiece];
    219 
    220       [message hasOptionalCord];
    221       message.hasOptionalCord = NO;
    222       [message hasOptionalCord];
    223 
    224       [message hasDefaultInt32];
    225       message.hasDefaultInt32 = NO;
    226       [message hasDefaultInt32];
    227 
    228       [message hasDefaultInt64];
    229       message.hasDefaultInt64 = NO;
    230       [message hasDefaultInt64];
    231 
    232       [message hasDefaultUint32];
    233       message.hasDefaultUint32 = NO;
    234       [message hasDefaultUint32];
    235 
    236       [message hasDefaultUint64];
    237       message.hasDefaultUint64 = NO;
    238       [message hasDefaultUint64];
    239 
    240       [message hasDefaultSint32];
    241       message.hasDefaultSint32 = NO;
    242       [message hasDefaultSint32];
    243 
    244       [message hasDefaultSint64];
    245       message.hasDefaultSint64 = NO;
    246       [message hasDefaultSint64];
    247 
    248       [message hasDefaultFixed32];
    249       message.hasDefaultFixed32 = NO;
    250       [message hasDefaultFixed32];
    251 
    252       [message hasDefaultFixed64];
    253       message.hasDefaultFixed64 = NO;
    254       [message hasDefaultFixed64];
    255 
    256       [message hasDefaultSfixed32];
    257       message.hasDefaultSfixed32 = NO;
    258       [message hasDefaultSfixed32];
    259 
    260       [message hasDefaultSfixed64];
    261       message.hasDefaultSfixed64 = NO;
    262       [message hasDefaultSfixed64];
    263 
    264       [message hasDefaultFloat];
    265       message.hasDefaultFloat = NO;
    266       [message hasDefaultFloat];
    267 
    268       [message hasDefaultDouble];
    269       message.hasDefaultDouble = NO;
    270       [message hasDefaultDouble];
    271 
    272       [message hasDefaultBool];
    273       message.hasDefaultBool = NO;
    274       [message hasDefaultBool];
    275 
    276       [message hasDefaultString];
    277       message.hasDefaultString = NO;
    278       [message hasDefaultString];
    279 
    280       [message hasDefaultBytes];
    281       message.hasDefaultBytes = NO;
    282       [message hasDefaultBytes];
    283 
    284       [message hasDefaultNestedEnum];
    285       message.hasDefaultNestedEnum = NO;
    286       [message hasDefaultNestedEnum];
    287 
    288       [message hasDefaultForeignEnum];
    289       message.hasDefaultForeignEnum = NO;
    290       [message hasDefaultForeignEnum];
    291 
    292       [message hasDefaultImportEnum];
    293       message.hasDefaultImportEnum = NO;
    294       [message hasDefaultImportEnum];
    295 
    296       [message hasDefaultStringPiece];
    297       message.hasDefaultStringPiece = NO;
    298       [message hasDefaultStringPiece];
    299 
    300       [message hasDefaultCord];
    301       message.hasDefaultCord = NO;
    302       [message hasDefaultCord];
    303     }
    304   }];
    305 }
    306 
    307 @end
    308