From 8e7906d062864e3457ca353dc556f4d9d957535c Mon Sep 17 00:00:00 2001 From: huzhiqiang <912790387@qq.com> Date: Wed, 8 Jan 2020 12:38:40 +0800 Subject: [PATCH] fix the issue that: loading model consumes too much time test=decelop (#2726) * fix the issue that: loading model consumes too much time test=decelop --- lite/model_parser/naive_buffer/naive_buffer.h | 33 +++++++++---------- lite/model_parser/naive_buffer/param_desc.cc | 9 +++-- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lite/model_parser/naive_buffer/naive_buffer.h b/lite/model_parser/naive_buffer/naive_buffer.h index 717dd3c5a6..9be2be9543 100644 --- a/lite/model_parser/naive_buffer/naive_buffer.h +++ b/lite/model_parser/naive_buffer/naive_buffer.h @@ -128,19 +128,23 @@ using Float64Builder = PrimaryBuilder; template class PrimaryListBuilder : public FieldBuilder { - std::vector data_; + const Primary* data_{nullptr}; + int size_{0}; public: using value_type = Primary; explicit PrimaryListBuilder(BinaryTable* table) : FieldBuilder(table) {} - PrimaryListBuilder(BinaryTable* table, const std::vector& val) - : FieldBuilder(table), data_(val) {} + PrimaryListBuilder(BinaryTable* table, const Primary* val, int size) + : FieldBuilder(table), data_(val), size_(size) {} /// Set data. - void set(const std::vector& x) { data_ = x; } + void set(const Primary* x, int size) { + data_ = x; + size_ = size; + } - const std::vector& data() const { return data_; } + const Primary* data() const { return data_; } /// Save information to the corresponding BinaryTable. void Save() override; @@ -149,14 +153,12 @@ class PrimaryListBuilder : public FieldBuilder { void Load() override; /// Number of elements. - size_t size() const { return data_.size(); } + size_t size() const { return size_; } - Type type() const override { - return core::StdTypeToRepr>(); - } + Type type() const override { return core::StdTypeToRepr(); } /// clear builder - void Clear() { data_.clear(); } + void Clear() { size_ = 0; } ~PrimaryListBuilder() = default; }; @@ -381,17 +383,14 @@ void PrimaryBuilder::Load() { template void PrimaryListBuilder::Load() { - CHECK(data_.empty()) << "Duplicate load"; + CHECK(data_ == nullptr) << "Duplicate load"; // Load number of elements first. uint64_t num_elems{}; memcpy(&num_elems, table()->cursor(), sizeof(uint64_t)); table()->Consume(sizeof(uint64_t)); - data_.resize(num_elems); - for (uint64_t i = 0; i < num_elems; i++) { - memcpy(&data_[i], table()->cursor(), sizeof(value_type)); - table()->Consume(sizeof(value_type)); - } + set(reinterpret_cast(table()->cursor()), num_elems); + table()->Consume(num_elems * sizeof(value_type)); } template @@ -404,7 +403,7 @@ void PrimaryListBuilder::Save() { table()->Require(num_elems * sizeof(value_type)); memcpy(table()->cursor(), - reinterpret_cast(&data_[0]), + reinterpret_cast(data_), num_elems * sizeof(value_type)); table()->Consume(num_elems * sizeof(value_type)); } diff --git a/lite/model_parser/naive_buffer/param_desc.cc b/lite/model_parser/naive_buffer/param_desc.cc index 4397b3c413..cc97b02716 100644 --- a/lite/model_parser/naive_buffer/param_desc.cc +++ b/lite/model_parser/naive_buffer/param_desc.cc @@ -150,9 +150,9 @@ void ParamDesc::SetDim(const std::vector& dim) { << "Data Type mismatch"; \ std::vector res; \ auto& data_builder = desc_->GetField>("data"); \ - auto& data = data_builder.data(); \ - size_t size = data.size() / sizeof(T); \ - auto* data_ptr = reinterpret_cast(&data[0]); \ + auto data = data_builder.data(); \ + size_t size = data_builder.size() / sizeof(T); \ + auto* data_ptr = reinterpret_cast(data); \ for (size_t i = 0; i < size; ++i) { \ res.push_back(data_ptr[i]); \ } \ @@ -178,8 +178,7 @@ GET_DATA_IMPL(double, FP64); data_builder->Clear(); \ size_t size = size__ * sizeof(T); \ auto* data_ptr = reinterpret_cast(data_ptr__); \ - std::vector data_vec(data_ptr, data_ptr + size); \ - data_builder->set(data_vec); + data_builder->set(data_ptr, size); #define SET_DATA_IMPL(T, type__) \ template <> \ -- GitLab