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: PerfTest()65 PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {} 66 SetUp()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 TearDown()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