RetroArch
perftest.h
Go to the documentation of this file.
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 #define RAPIDJSON_HAS_STDSTRING 1
34 
36 // Google Test
37 
38 #ifdef __cplusplus
39 
40 // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS.
41 #ifndef __STDC_CONSTANT_MACROS
42 # define __STDC_CONSTANT_MACROS 1 // required by C++ standard
43 #endif
44 
45 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
46 #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
47 #pragma GCC diagnostic push
48 #endif
49 #pragma GCC diagnostic ignored "-Weffc++"
50 #endif
51 
52 #include "gtest/gtest.h"
53 
54 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
55 #pragma GCC diagnostic pop
56 #endif
57 
58 #ifdef _MSC_VER
59 #define _CRTDBG_MAP_ALLOC
60 #include <crtdbg.h>
61 #pragma warning(disable : 4996) // 'function': was declared deprecated
62 #endif
63 
65 class PerfTest : public ::testing::Test {
66 public:
67  PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {}
68 
69  virtual void SetUp() {
70  {
71  const char *paths[] = {
72  "data/sample.json",
73  "bin/data/sample.json",
74  "../bin/data/sample.json",
75  "../../bin/data/sample.json",
76  "../../../bin/data/sample.json"
77  };
78 
79  FILE *fp = 0;
80  for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
81  fp = fopen(filename_ = paths[i], "rb");
82  if (fp)
83  break;
84  }
85  ASSERT_TRUE(fp != 0);
86 
87  fseek(fp, 0, SEEK_END);
88  length_ = (size_t)ftell(fp);
89  fseek(fp, 0, SEEK_SET);
90  json_ = (char*)malloc(length_ + 1);
91  ASSERT_EQ(length_, fread(json_, 1, length_, fp));
92  json_[length_] = '\0';
93  fclose(fp);
94  }
95 
96  // whitespace test
97  {
98  whitespace_length_ = 1024 * 1024;
99  whitespace_ = (char *)malloc(whitespace_length_ + 4);
100  char *p = whitespace_;
101  for (size_t i = 0; i < whitespace_length_; i += 4) {
102  *p++ = ' ';
103  *p++ = '\n';
104  *p++ = '\r';
105  *p++ = '\t';
106  }
107  *p++ = '[';
108  *p++ = '0';
109  *p++ = ']';
110  *p++ = '\0';
111  }
112 
113  // types test
114  {
115  const char *typespaths[] = {
116  "data/types",
117  "bin/types",
118  "../bin/types",
119  "../../bin/types/",
120  "../../../bin/types"
121  };
122 
123  const char* typesfilenames[] = {
124  "booleans.json",
125  "floats.json",
126  "guids.json",
127  "integers.json",
128  "mixed.json",
129  "nulls.json",
130  "paragraphs.json"
131  };
132 
133  for (size_t j = 0; j < sizeof(typesfilenames) / sizeof(typesfilenames[0]); j++) {
134  types_[j] = 0;
135  for (size_t i = 0; i < sizeof(typespaths) / sizeof(typespaths[0]); i++) {
136  char filename[256];
137  sprintf(filename, "%s/%s", typespaths[i], typesfilenames[j]);
138  if (FILE* fp = fopen(filename, "rb")) {
139  fseek(fp, 0, SEEK_END);
140  typesLength_[j] = (size_t)ftell(fp);
141  fseek(fp, 0, SEEK_SET);
142  types_[j] = (char*)malloc(typesLength_[j] + 1);
143  ASSERT_EQ(typesLength_[j], fread(types_[j], 1, typesLength_[j], fp));
144  types_[j][typesLength_[j]] = '\0';
145  fclose(fp);
146  break;
147  }
148  }
149  }
150  }
151  }
152 
153  virtual void TearDown() {
154  free(json_);
155  free(whitespace_);
156  json_ = 0;
157  whitespace_ = 0;
158  for (size_t i = 0; i < 7; i++) {
159  free(types_[i]);
160  types_[i] = 0;
161  }
162  }
163 
164 private:
165  PerfTest(const PerfTest&);
166  PerfTest& operator=(const PerfTest&);
167 
168 protected:
169  const char* filename_;
170  char *json_;
171  size_t length_;
172  char *whitespace_;
173  size_t whitespace_length_;
174  char *types_[7];
175  size_t typesLength_[7];
176 
177  static const size_t kTrialCount = 1000;
178 };
179 
180 #endif // __cplusplus
181 
182 #endif // PERFTEST_H_
#define ftell
Definition: file_stream_transforms.h:54
void * malloc(YYSIZE_T)
#define SEEK_END
Definition: zconf.h:440
GLsizei const GLuint * paths
Definition: glext.h:12624
#define fclose
Definition: file_stream_transforms.h:53
#define SEEK_SET
Definition: zconf.h:438
int sprintf(char *s, const char *format,...)
Definition: compat_ctype.c:81
GLfloat GLfloat p
Definition: glext.h:9809
#define FILE
Definition: file_stream_transforms.h:35
void free(void *)
GLint j
Definition: nx_glsym.h:307
#define fread
Definition: file_stream_transforms.h:56
#define fopen
Definition: file_stream_transforms.h:52
#define fseek
Definition: file_stream_transforms.h:55