| // Tencent is pleased to support the open source community by making RapidJSON available. | |
| // | |
| // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. | |
| // | |
| // Licensed under the MIT License (the "License"); you may not use this file except | |
| // in compliance with the License. You may obtain a copy of the License at | |
| // | |
| // http://opensource.org/licenses/MIT | |
| // | |
| // Unless required by applicable law or agreed to in writing, software distributed | |
| // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | |
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations under the License. | |
| #ifndef PERFTEST_H_ | |
| #define PERFTEST_H_ | |
| #define TEST_RAPIDJSON 1 | |
| #define TEST_PLATFORM 0 | |
| #define TEST_MISC 0 | |
| #define TEST_VERSION_CODE(x,y,z) \ | |
| (((x)*100000) + ((y)*100) + (z)) | |
| // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler. | |
| // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported. | |
| #if defined(__SSE4_2__) | |
| # define RAPIDJSON_SSE42 | |
| #elif defined(__SSE2__) | |
| # define RAPIDJSON_SSE2 | |
| #endif | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Google Test | |
| #ifdef __cplusplus | |
| // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS. | |
| #ifndef __STDC_CONSTANT_MACROS | |
| # define __STDC_CONSTANT_MACROS 1 // required by C++ standard | |
| #endif | |
| #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) | |
| #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |
| #pragma GCC diagnostic push | |
| #endif | |
| #pragma GCC diagnostic ignored "-Weffc++" | |
| #endif | |
| #include "gtest/gtest.h" | |
| #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |
| #pragma GCC diagnostic pop | |
| #endif | |
| #ifdef _MSC_VER | |
| #define _CRTDBG_MAP_ALLOC | |
| #include <crtdbg.h> | |
| #pragma warning(disable : 4996) // 'function': was declared deprecated | |
| #endif | |
| //! Base class for all performance tests | |
| class PerfTest : public ::testing::Test { | |
| public: | |
| PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {} | |
| virtual void SetUp() { | |
| { | |
| const char *paths[] = { | |
| "data/sample.json", | |
| "bin/data/sample.json", | |
| "../bin/data/sample.json", | |
| "../../bin/data/sample.json", | |
| "../../../bin/data/sample.json" | |
| }; | |
| FILE *fp = 0; | |
| for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { | |
| fp = fopen(filename_ = paths[i], "rb"); | |
| if (fp) | |
| break; | |
| } | |
| ASSERT_TRUE(fp != 0); | |
| fseek(fp, 0, SEEK_END); | |
| length_ = (size_t)ftell(fp); | |
| fseek(fp, 0, SEEK_SET); | |
| json_ = (char*)malloc(length_ + 1); | |
| ASSERT_EQ(length_, fread(json_, 1, length_, fp)); | |
| json_[length_] = '\0'; | |
| fclose(fp); | |
| } | |
| // whitespace test | |
| { | |
| whitespace_length_ = 1024 * 1024; | |
| whitespace_ = (char *)malloc(whitespace_length_ + 4); | |
| char *p = whitespace_; | |
| for (size_t i = 0; i < whitespace_length_; i += 4) { | |
| *p++ = ' '; | |
| *p++ = '\n'; | |
| *p++ = '\r'; | |
| *p++ = '\t'; | |
| } | |
| *p++ = '['; | |
| *p++ = '0'; | |
| *p++ = ']'; | |
| *p++ = '\0'; | |
| } | |
| // types test | |
| { | |
| const char *typespaths[] = { | |
| "data/types", | |
| "bin/types", | |
| "../bin/types", | |
| "../../bin/types/", | |
| "../../../bin/types" | |
| }; | |
| const char* typesfilenames[] = { | |
| "booleans.json", | |
| "floats.json", | |
| "guids.json", | |
| "integers.json", | |
| "mixed.json", | |
| "nulls.json", | |
| "paragraphs.json" | |
| }; | |
| for (size_t j = 0; j < sizeof(typesfilenames) / sizeof(typesfilenames[0]); j++) { | |
| types_[j] = 0; | |
| for (size_t i = 0; i < sizeof(typespaths) / sizeof(typespaths[0]); i++) { | |
| char filename[256]; | |
| sprintf(filename, "%s/%s", typespaths[i], typesfilenames[j]); | |
| if (FILE* fp = fopen(filename, "rb")) { | |
| fseek(fp, 0, SEEK_END); | |
| typesLength_[j] = (size_t)ftell(fp); | |
| fseek(fp, 0, SEEK_SET); | |
| types_[j] = (char*)malloc(typesLength_[j] + 1); | |
| ASSERT_EQ(typesLength_[j], fread(types_[j], 1, typesLength_[j], fp)); | |
| types_[j][typesLength_[j]] = '\0'; | |
| fclose(fp); | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| virtual void TearDown() { | |
| free(json_); | |
| free(whitespace_); | |
| json_ = 0; | |
| whitespace_ = 0; | |
| for (size_t i = 0; i < 7; i++) { | |
| free(types_[i]); | |
| types_[i] = 0; | |
| } | |
| } | |
| private: | |
| PerfTest(const PerfTest&); | |
| PerfTest& operator=(const PerfTest&); | |
| protected: | |
| const char* filename_; | |
| char *json_; | |
| size_t length_; | |
| char *whitespace_; | |
| size_t whitespace_length_; | |
| char *types_[7]; | |
| size_t typesLength_[7]; | |
| static const size_t kTrialCount = 1000; | |
| }; | |
| #endif // __cplusplus | |
| #endif // PERFTEST_H_ |