cli-table3 icon indicating copy to clipboard operation
cli-table3 copied to clipboard

`tb.toString()` performance

Open 0x8f701 opened this issue 7 years ago • 7 comments

Hello, I found that when the number of rows is huge, I start to have some performance problems.

I have 1763 rows (5 columns) and it takes me 4473.023ms to run toString method, I want to know if there is a way to improve the performance ?

Thank you!

0x8f701 avatar Dec 06 '18 20:12 0x8f701

screenshot from 2018-12-06 21-16-09 A row is like this, but isn't always so big.

0x8f701 avatar Dec 06 '18 20:12 0x8f701

there probably are ways to speed it up, it "just" needs someone with a bit of time and knowledge of profiling 😉

Turbo87 avatar Dec 06 '18 20:12 Turbo87

Can you provide some more info like the Node.js version and a reproducible test case?

DanielRuf avatar Jan 28 '19 20:01 DanielRuf

Pending #278, which is intended to resolve a layout bug, includes some performance gains that can be furthered.

After doing some further benchmarking, I believe it might be possible to get the layout rending of 100k cells to under or around 2 seconds—which might get close to "as good as it gets", or, roughly, a 3,600% decrease in rendering time at the least. Rendering 10k cells, would be well below 1 second (depending on table complexity).

Insofar, only the layoutTable() function has been refactored yet all of the makeTableLayout() function can likely be accomplished in a single pass over the table. Presently it's traversing the table 4+ times with some "exponential looping" remaining in fillInTable(), addRowSpanCells(), and addColSpanCells().

I haven't written many performance tests, but think I'll take a stab at it. My hunch is to attempt to test for a time increase exceeding a threshold on nominally sized tables rather than rendering large tables and testing that they rendered within a fixed threshold. I'll try to post a PR with failing tests when I've got one and work from there!

speedytwenty avatar Mar 28 '22 17:03 speedytwenty

With the release of 0.6.2 and #278, the performance of cli-table3 should noticeably increase for nearly all large tables—while even small tables will render in substantially less time at a micro level.

Using the performance testing tool at #294, rendering-time for a 1,763 x 5 table has decreased from the stated 4.5 seconds to approximately 0.5 seconds.

While this is 800% better, and likely sufficient in most cases, the memory consumption is still terrible and there is another ~2,500% decrease in rendering time that can be had!

Update to v0.6.2+ for these (initial) performance enhancements.

âž­ node scripts/generate 1763 5
Generating basic table with 1763 rows and 5 columns:
Memory usage at startup: 2.6783065795898438mb
Memory usage after table build: 3.9880523681640625mb
table built in 4.863 ms
Memory usage after table rendered: 21.6505126953125mb
table rendered in 490.181 ms

speedytwenty avatar Apr 13 '22 12:04 speedytwenty