// 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. // Likewise, __ARM_NEON is used to detect Neon. #if defined(__SSE4_2__) # define RAPIDJSON_SSE42 #elif defined(__SSE2__) # define RAPIDJSON_SSE2 #elif defined(__ARM_NEON) # define RAPIDJSON_NEON #endif #define RAPIDJSON_HAS_STDSTRING 1 //////////////////////////////////////////////////////////////////////////////// // 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 #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_