Home | History | Annotate | Download | only in perftest
      1 // Tencent is pleased to support the open source community by making RapidJSON available.
      2 //
      3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
      4 //
      5 // Licensed under the MIT License (the "License"); you may not use this file except
      6 // in compliance with the License. You may obtain a copy of the License at
      7 //
      8 // http://opensource.org/licenses/MIT
      9 //
     10 // Unless required by applicable law or agreed to in writing, software distributed
     11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
     12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
     13 // specific language governing permissions and limitations under the License.
     14 
     15 #ifndef PERFTEST_H_
     16 #define PERFTEST_H_
     17 
     18 #define TEST_RAPIDJSON  1
     19 #define TEST_PLATFORM   0
     20 #define TEST_MISC       0
     21 
     22 #define TEST_VERSION_CODE(x,y,z) \
     23   (((x)*100000) + ((y)*100) + (z))
     24 
     25 // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler.
     26 // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported.
     27 #if defined(__SSE4_2__)
     28 #  define RAPIDJSON_SSE42
     29 #elif defined(__SSE2__)
     30 #  define RAPIDJSON_SSE2
     31 #endif
     32 
     33 ////////////////////////////////////////////////////////////////////////////////
     34 // Google Test
     35 
     36 #ifdef __cplusplus
     37 
     38 // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS.
     39 #ifndef __STDC_CONSTANT_MACROS
     40 #  define __STDC_CONSTANT_MACROS 1 // required by C++ standard
     41 #endif
     42 
     43 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
     44 #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
     45 #pragma GCC diagnostic push
     46 #endif
     47 #pragma GCC diagnostic ignored "-Weffc++"
     48 #endif
     49 
     50 #include "gtest/gtest.h"
     51 
     52 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
     53 #pragma GCC diagnostic pop
     54 #endif
     55 
     56 #ifdef _MSC_VER
     57 #define _CRTDBG_MAP_ALLOC
     58 #include <crtdbg.h>
     59 #pragma warning(disable : 4996) // 'function': was declared deprecated
     60 #endif
     61 
     62 //! Base class for all performance tests
     63 class PerfTest : public ::testing::Test {
     64 public:
     65     PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {}
     66 
     67     virtual void SetUp() {
     68 
     69         const char *paths[] = {
     70             "data/sample.json",
     71             "bin/data/sample.json",
     72             "../bin/data/sample.json",
     73             "../../bin/data/sample.json",
     74             "../../../bin/data/sample.json"
     75         };
     76         FILE *fp = 0;
     77         for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
     78             fp = fopen(filename_ = paths[i], "rb");
     79             if (fp)
     80                 break;
     81         }
     82         ASSERT_TRUE(fp != 0);
     83 
     84         fseek(fp, 0, SEEK_END);
     85         length_ = (size_t)ftell(fp);
     86         fseek(fp, 0, SEEK_SET);
     87         json_ = (char*)malloc(length_ + 1);
     88         ASSERT_EQ(length_, fread(json_, 1, length_, fp));
     89         json_[length_] = '\0';
     90         fclose(fp);
     91 
     92         // whitespace test
     93         whitespace_length_ = 1024 * 1024;
     94         whitespace_ = (char *)malloc(whitespace_length_  + 4);
     95         char *p = whitespace_;
     96         for (size_t i = 0; i < whitespace_length_; i += 4) {
     97             *p++ = ' ';
     98             *p++ = '\n';
     99             *p++ = '\r';
    100             *p++ = '\t';
    101         }
    102         *p++ = '[';
    103         *p++ = '0';
    104         *p++ = ']';
    105         *p++ = '\0';
    106     }
    107 
    108     virtual void TearDown() {
    109         free(json_);
    110         free(whitespace_);
    111         json_ = 0;
    112         whitespace_ = 0;
    113     }
    114 
    115 private:
    116     PerfTest(const PerfTest&);
    117     PerfTest& operator=(const PerfTest&);
    118 
    119 protected:
    120     const char* filename_;
    121     char *json_;
    122     size_t length_;
    123     char *whitespace_;
    124     size_t whitespace_length_;
    125 
    126     static const size_t kTrialCount = 1000;
    127 };
    128 
    129 #endif // __cplusplus
    130 
    131 #endif // PERFTEST_H_
    132