Modify writer benchmark to make comparisons between column and row usage

- Cut time to write a sheet with many rows by not calling highest_row inside a loop over the rows (On^2 -> On)
- Observation: more memory is used / cell as the number of rows increases
This commit is contained in:
Crzyrndm 2018-07-29 10:10:36 +12:00
parent e350570ae6
commit 138c90883b
2 changed files with 16 additions and 18 deletions

View File

@ -39,11 +39,10 @@ void writer(int cols, int rows)
for(int index = 0; index < rows; index++) for(int index = 0; index < rows; index++)
{ {
if ((index + 1) % (rows / 10) == 0) if (rows >= 10 && (index + 1) % (rows / 10) == 0)
{ {
std::string progress = std::string((index + 1) / (1 + rows / 10), '.'); std::string progress = std::string((index + 1) / (1 + rows / 10), '.');
std::cout << "\r" << progress; std::cout << "\r" << progress;
std::cout.flush();
} }
for (int i = 0; i < cols; i++) for (int i = 0; i < cols; i++)
@ -51,8 +50,7 @@ void writer(int cols, int rows)
ws.cell(xlnt::cell_reference(i + 1, index + 1)).value(i); ws.cell(xlnt::cell_reference(i + 1, index + 1)).value(i);
} }
} }
std::cout << '\n';
std::cout << std::endl;
auto filename = "benchmark.xlsx"; auto filename = "benchmark.xlsx";
wb.save(filename); wb.save(filename);
@ -63,33 +61,32 @@ void writer(int cols, int rows)
// Time from the best of three is taken. // Time from the best of three is taken.
void timer(std::function<void(int, int)> fn, int cols, int rows) void timer(std::function<void(int, int)> fn, int cols, int rows)
{ {
using xlnt::benchmarks::current_time;
const auto repeat = std::size_t(3); const auto repeat = std::size_t(3);
auto time = std::numeric_limits<std::size_t>::max(); std::chrono::duration<double> time{};
std::cout << cols << " cols " << rows << " rows" << std::endl; std::cout << cols << " cols " << rows << " rows" << std::endl;
fn(rows, cols); // 1 cold run
for(int i = 0; i < repeat; i++) for(int i = 0; i < repeat; i++)
{ {
auto start = current_time(); auto start = std::chrono::high_resolution_clock::now();
fn(cols, rows); fn(cols, rows);
time = std::min(current_time() - start, time); time += std::chrono::high_resolution_clock::now() - start;
} }
std::cout << time / 1000.0 << std::endl; std::cout << time.count() / repeat << " seconds per iteration" << '\n' << '\n';
} }
} // namespace } // namespace
int main() int main()
{ {
timer(&writer, 100, 100); timer(&writer, 160000, 1);
timer(&writer, 1000, 100); timer(&writer, 6400, 25);
timer(&writer, 4000, 100); timer(&writer, 1600, 100);
timer(&writer, 8192, 100); timer(&writer, 400, 400);
timer(&writer, 10, 10000); timer(&writer, 100, 1600);
timer(&writer, 4000, 1000); timer(&writer, 25, 6400);
timer(&writer, 1, 160000);
return 0; return 0;
} }

View File

@ -2180,7 +2180,8 @@ void xlsx_producer::write_worksheet(const relationship &rel)
return true; return true;
} }
for (auto row = ws.lowest_row(); row <= ws.highest_row(); ++row) auto highest = ws.highest_row();
for (auto row = ws.lowest_row(); row <= highest; ++row)
{ {
if (ws.has_row_properties(row) && ws.row_properties(row).dy_descent.is_set()) if (ws.has_row_properties(row) && ws.row_properties(row).dy_descent.is_set())
{ {