mirror of
				https://github.com/RetroDECK/ES-DE.git
				synced 2025-04-10 19:15:13 +00:00 
			
		
		
		
	
		
			
	
	
		
			565 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			565 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | // 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.
 | ||
|  | //
 | ||
|  | // 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.
 | ||
|  | 
 | ||
|  | #include "perftest.h"
 | ||
|  | 
 | ||
|  | #if TEST_RAPIDJSON
 | ||
|  | 
 | ||
|  | #include "rapidjson/rapidjson.h"
 | ||
|  | #include "rapidjson/document.h"
 | ||
|  | #include "rapidjson/prettywriter.h"
 | ||
|  | #include "rapidjson/stringbuffer.h"
 | ||
|  | #include "rapidjson/filereadstream.h"
 | ||
|  | #include "rapidjson/istreamwrapper.h"
 | ||
|  | #include "rapidjson/encodedstream.h"
 | ||
|  | #include "rapidjson/memorystream.h"
 | ||
|  | 
 | ||
|  | #include <fstream>
 | ||
|  | #include <vector>
 | ||
|  | 
 | ||
|  | #ifdef RAPIDJSON_SSE2
 | ||
|  | #define SIMD_SUFFIX(name) name##_SSE2
 | ||
|  | #elif defined(RAPIDJSON_SSE42)
 | ||
|  | #define SIMD_SUFFIX(name) name##_SSE42
 | ||
|  | #elif defined(RAPIDJSON_NEON)
 | ||
|  | #define SIMD_SUFFIX(name) name##_NEON
 | ||
|  | #else
 | ||
|  | #define SIMD_SUFFIX(name) name
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | using namespace rapidjson; | ||
|  | 
 | ||
|  | class RapidJson : public PerfTest { | ||
|  | public: | ||
|  |     RapidJson() : temp_(), doc_() {} | ||
|  | 
 | ||
|  |     virtual void SetUp() { | ||
|  |         PerfTest::SetUp(); | ||
|  | 
 | ||
|  |         // temp buffer for insitu parsing.
 | ||
|  |         temp_ = (char *)malloc(length_ + 1); | ||
|  | 
 | ||
|  |         // Parse as a document
 | ||
|  |         EXPECT_FALSE(doc_.Parse(json_).HasParseError()); | ||
|  | 
 | ||
|  |         for (size_t i = 0; i < 8; i++) | ||
|  |             EXPECT_FALSE(typesDoc_[i].Parse(types_[i]).HasParseError()); | ||
|  |     } | ||
|  | 
 | ||
|  |     virtual void TearDown() { | ||
|  |         PerfTest::TearDown(); | ||
|  |         free(temp_); | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     RapidJson(const RapidJson&); | ||
|  |     RapidJson& operator=(const RapidJson&); | ||
|  | 
 | ||
|  | protected: | ||
|  |     char *temp_; | ||
|  |     Document doc_; | ||
|  |     Document typesDoc_[8]; | ||
|  | }; | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         InsituStringStream s(temp_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseInsituFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler_ValidateEncoding)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         InsituStringStream s(temp_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream s(json_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #define TEST_TYPED(index, Name)\
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_##Name)) {\ | ||
|  |     for (size_t i = 0; i < kTrialCount * 10; i++) {\ | ||
|  |         StringStream s(types_[index]);\ | ||
|  |         BaseReaderHandler<> h;\ | ||
|  |         Reader reader;\ | ||
|  |         EXPECT_TRUE(reader.Parse(s, h));\ | ||
|  |     }\ | ||
|  | }\ | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseInsitu_DummyHandler_##Name)) {\ | ||
|  |     for (size_t i = 0; i < kTrialCount * 10; i++) {\ | ||
|  |         memcpy(temp_, types_[index], typesLength_[index] + 1);\ | ||
|  |         InsituStringStream s(temp_);\ | ||
|  |         BaseReaderHandler<> h;\ | ||
|  |         Reader reader;\ | ||
|  |         EXPECT_TRUE(reader.Parse<kParseInsituFlag>(s, h));\ | ||
|  |     }\ | ||
|  | } | ||
|  | 
 | ||
|  | TEST_TYPED(0, Booleans) | ||
|  | TEST_TYPED(1, Floats) | ||
|  | TEST_TYPED(2, Guids) | ||
|  | TEST_TYPED(3, Integers) | ||
|  | TEST_TYPED(4, Mixed) | ||
|  | TEST_TYPED(5, Nulls) | ||
|  | TEST_TYPED(6, Paragraphs) | ||
|  | 
 | ||
|  | #undef TEST_TYPED
 | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FullPrecision)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream s(json_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseFullPrecisionFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterative_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream s(json_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseIterativeFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativeInsitu_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         InsituStringStream s(temp_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseIterativeFlag|kParseInsituFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePull_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream s(json_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.IterativeParseInit(); | ||
|  |         while (!reader.IterativeParseComplete()) { | ||
|  |             if (!reader.IterativeParseNext<kParseDefaultFlags>(s, h)) | ||
|  |                 break; | ||
|  |         } | ||
|  |         EXPECT_FALSE(reader.HasParseError()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParseIterativePullInsitu_DummyHandler)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         InsituStringStream s(temp_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.IterativeParseInit(); | ||
|  |         while (!reader.IterativeParseComplete()) { | ||
|  |             if (!reader.IterativeParseNext<kParseDefaultFlags|kParseInsituFlag>(s, h)) | ||
|  |                 break; | ||
|  |         } | ||
|  |         EXPECT_FALSE(reader.HasParseError()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_ValidateEncoding)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream s(json_); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         EXPECT_TRUE(reader.Parse<kParseValidateEncodingFlag>(s, h)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseInsitu_MemoryPoolAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         Document doc; | ||
|  |         doc.ParseInsitu(temp_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterativeInsitu_MemoryPoolAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         Document doc; | ||
|  |         doc.ParseInsitu<kParseIterativeFlag>(temp_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_MemoryPoolAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         Document doc; | ||
|  |         doc.Parse(json_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseLength_MemoryPoolAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         Document doc; | ||
|  |         doc.Parse(json_, length_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #if RAPIDJSON_HAS_STDSTRING
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseStdString_MemoryPoolAllocator)) { | ||
|  |     const std::string s(json_, length_); | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         Document doc; | ||
|  |         doc.Parse(s); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseIterative_MemoryPoolAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         Document doc; | ||
|  |         doc.Parse<kParseIterativeFlag>(json_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParse_CrtAllocator)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         memcpy(temp_, json_, length_ + 1); | ||
|  |         GenericDocument<UTF8<>, CrtAllocator> doc; | ||
|  |         doc.Parse(temp_); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseEncodedInputStream_MemoryStream)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         MemoryStream ms(json_, length_); | ||
|  |         EncodedInputStream<UTF8<>, MemoryStream> is(ms); | ||
|  |         Document doc; | ||
|  |         doc.ParseStream<0, UTF8<> >(is); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(DocumentParseAutoUTFInputStream_MemoryStream)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         MemoryStream ms(json_, length_); | ||
|  |         AutoUTFInputStream<unsigned, MemoryStream> is(ms); | ||
|  |         Document doc; | ||
|  |         doc.ParseStream<0, AutoUTF<unsigned> >(is); | ||
|  |         ASSERT_TRUE(doc.IsObject()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | size_t Traverse(const T& value) { | ||
|  |     size_t count = 1; | ||
|  |     switch(value.GetType()) { | ||
|  |         case kObjectType: | ||
|  |             for (typename T::ConstMemberIterator itr = value.MemberBegin(); itr != value.MemberEnd(); ++itr) { | ||
|  |                 count++;    // name
 | ||
|  |                 count += Traverse(itr->value); | ||
|  |             } | ||
|  |             break; | ||
|  | 
 | ||
|  |         case kArrayType: | ||
|  |             for (typename T::ConstValueIterator itr = value.Begin(); itr != value.End(); ++itr) | ||
|  |                 count += Traverse(*itr); | ||
|  |             break; | ||
|  | 
 | ||
|  |         default: | ||
|  |             // Do nothing.
 | ||
|  |             break; | ||
|  |     } | ||
|  |     return count; | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, DocumentTraverse) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         size_t count = Traverse(doc_); | ||
|  |         EXPECT_EQ(4339u, count); | ||
|  |         //if (i == 0)
 | ||
|  |         //  std::cout << count << std::endl;
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #ifdef __GNUC__
 | ||
|  | RAPIDJSON_DIAG_PUSH | ||
|  | RAPIDJSON_DIAG_OFF(effc++) | ||
|  | #endif
 | ||
|  | 
 | ||
|  | struct ValueCounter : public BaseReaderHandler<> { | ||
|  |     ValueCounter() : count_(1) {}   // root
 | ||
|  | 
 | ||
|  |     bool EndObject(SizeType memberCount) { count_ += memberCount * 2; return true; } | ||
|  |     bool EndArray(SizeType elementCount) { count_ += elementCount; return true; } | ||
|  | 
 | ||
|  |     SizeType count_; | ||
|  | }; | ||
|  | 
 | ||
|  | #ifdef __GNUC__
 | ||
|  | RAPIDJSON_DIAG_POP | ||
|  | #endif
 | ||
|  | 
 | ||
|  | TEST_F(RapidJson, DocumentAccept) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         ValueCounter counter; | ||
|  |         doc_.Accept(counter); | ||
|  |         EXPECT_EQ(4339u, counter.count_); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, DocumentFind) { | ||
|  |     typedef Document::ValueType ValueType; | ||
|  |     typedef ValueType::ConstMemberIterator ConstMemberIterator; | ||
|  |     const Document &doc = typesDoc_[7]; // alotofkeys.json
 | ||
|  |     if (doc.IsObject()) { | ||
|  |         std::vector<const ValueType*> keys; | ||
|  |         for (ConstMemberIterator it = doc.MemberBegin(); it != doc.MemberEnd(); ++it) { | ||
|  |             keys.push_back(&it->name); | ||
|  |         } | ||
|  |         for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |             for (size_t j = 0; j < keys.size(); j++) { | ||
|  |                 EXPECT_TRUE(doc.FindMember(*keys[j]) != doc.MemberEnd()); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | struct NullStream { | ||
|  |     typedef char Ch; | ||
|  | 
 | ||
|  |     NullStream() /*: length_(0)*/ {} | ||
|  |     void Put(Ch) { /*++length_;*/ } | ||
|  |     void Flush() {} | ||
|  |     //size_t length_;
 | ||
|  | }; | ||
|  | 
 | ||
|  | TEST_F(RapidJson, Writer_NullStream) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         NullStream s; | ||
|  |         Writer<NullStream> writer(s); | ||
|  |         doc_.Accept(writer); | ||
|  |         //if (i == 0)
 | ||
|  |         //  std::cout << s.length_ << std::endl;
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(Writer_StringBuffer)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringBuffer s(0, 1024 * 1024); | ||
|  |         Writer<StringBuffer> writer(s); | ||
|  |         doc_.Accept(writer); | ||
|  |         const char* str = s.GetString(); | ||
|  |         (void)str; | ||
|  |         //if (i == 0)
 | ||
|  |         //  std::cout << strlen(str) << std::endl;
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #define TEST_TYPED(index, Name)\
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(Writer_StringBuffer_##Name)) {\ | ||
|  |     for (size_t i = 0; i < kTrialCount * 10; i++) {\ | ||
|  |         StringBuffer s(0, 1024 * 1024);\ | ||
|  |         Writer<StringBuffer> writer(s);\ | ||
|  |         typesDoc_[index].Accept(writer);\ | ||
|  |         const char* str = s.GetString();\ | ||
|  |         (void)str;\ | ||
|  |     }\ | ||
|  | } | ||
|  | 
 | ||
|  | TEST_TYPED(0, Booleans) | ||
|  | TEST_TYPED(1, Floats) | ||
|  | TEST_TYPED(2, Guids) | ||
|  | TEST_TYPED(3, Integers) | ||
|  | TEST_TYPED(4, Mixed) | ||
|  | TEST_TYPED(5, Nulls) | ||
|  | TEST_TYPED(6, Paragraphs) | ||
|  | 
 | ||
|  | #undef TEST_TYPED
 | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(PrettyWriter_StringBuffer)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringBuffer s(0, 2048 * 1024); | ||
|  |         PrettyWriter<StringBuffer> writer(s); | ||
|  |         writer.SetIndent(' ', 1); | ||
|  |         doc_.Accept(writer); | ||
|  |         const char* str = s.GetString(); | ||
|  |         (void)str; | ||
|  |         //if (i == 0)
 | ||
|  |         //  std::cout << strlen(str) << std::endl;
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, internal_Pow10) { | ||
|  |     double sum = 0; | ||
|  |     for (size_t i = 0; i < kTrialCount * kTrialCount; i++) | ||
|  |         sum += internal::Pow10(int(i & 255)); | ||
|  |     EXPECT_GT(sum, 0.0); | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SkipWhitespace_Basic) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         rapidjson::StringStream s(whitespace_); | ||
|  |         while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') | ||
|  |             s.Take(); | ||
|  |         ASSERT_EQ('[', s.Peek()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(SkipWhitespace)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         rapidjson::StringStream s(whitespace_); | ||
|  |         rapidjson::SkipWhitespace(s); | ||
|  |         ASSERT_EQ('[', s.Peek()); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SkipWhitespace_strspn) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         const char* s = whitespace_ + std::strspn(whitespace_, " \t\r\n"); | ||
|  |         ASSERT_EQ('[', *s); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, UTF8_Validate) { | ||
|  |     NullStream os; | ||
|  | 
 | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         StringStream is(json_); | ||
|  |         bool result = true; | ||
|  |         while (is.Peek() != '\0') | ||
|  |             result &= UTF8<>::Validate(is, os); | ||
|  |         EXPECT_TRUE(result); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, FileReadStream) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         FILE *fp = fopen(filename_, "rb"); | ||
|  |         char buffer[65536]; | ||
|  |         FileReadStream s(fp, buffer, sizeof(buffer)); | ||
|  |         while (s.Take() != '\0') | ||
|  |             ; | ||
|  |         fclose(fp); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_FileReadStream)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         FILE *fp = fopen(filename_, "rb"); | ||
|  |         char buffer[65536]; | ||
|  |         FileReadStream s(fp, buffer, sizeof(buffer)); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.Parse(s, h); | ||
|  |         fclose(fp); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, IStreamWrapper) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is(filename_, std::ios::in | std::ios::binary); | ||
|  |         char buffer[65536]; | ||
|  |         IStreamWrapper isw(is, buffer, sizeof(buffer)); | ||
|  |         while (isw.Take() != '\0') | ||
|  |             ; | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, IStreamWrapper_Unbuffered) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is(filename_, std::ios::in | std::ios::binary); | ||
|  |         IStreamWrapper isw(is); | ||
|  |         while (isw.Take() != '\0') | ||
|  |             ; | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, IStreamWrapper_Setbuffered) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is; | ||
|  |         char buffer[65536]; | ||
|  |         is.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); | ||
|  |         is.open(filename_, std::ios::in | std::ios::binary); | ||
|  |         IStreamWrapper isw(is); | ||
|  |         while (isw.Take() != '\0') | ||
|  |             ; | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is(filename_, std::ios::in | std::ios::binary); | ||
|  |         char buffer[65536]; | ||
|  |         IStreamWrapper isw(is, buffer, sizeof(buffer)); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.Parse(isw, h); | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper_Unbuffered)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is(filename_, std::ios::in | std::ios::binary); | ||
|  |         IStreamWrapper isw(is); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.Parse(isw, h); | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, SIMD_SUFFIX(ReaderParse_DummyHandler_IStreamWrapper_Setbuffered)) { | ||
|  |     for (size_t i = 0; i < kTrialCount; i++) { | ||
|  |         std::ifstream is; | ||
|  |         char buffer[65536]; | ||
|  |         is.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); | ||
|  |         is.open(filename_, std::ios::in | std::ios::binary); | ||
|  |         IStreamWrapper isw(is); | ||
|  |         BaseReaderHandler<> h; | ||
|  |         Reader reader; | ||
|  |         reader.Parse(isw, h); | ||
|  |         is.close(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | TEST_F(RapidJson, StringBuffer) { | ||
|  |     StringBuffer sb; | ||
|  |     for (int i = 0; i < 32 * 1024 * 1024; i++) | ||
|  |         sb.Put(i & 0x7f); | ||
|  | } | ||
|  | 
 | ||
|  | #endif // TEST_RAPIDJSON
 |