p-ranav / tabulate

Table Maker for Modern C++

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

std::cout << tab really slow?

nickhuangxinyu opened this issue · comments

Hi, tabulate is very beatiful.

but compare with plain cout, it seems much slower.

my plain cout cost 0.002s but after i use tabulate, it cost 0.05 about 25 times comparing with plain.

Is there any method to speed up?

ps. i always use tabulate to show a stl map.
using table, add key row and column row, set some show style.

Did i miss anything?

thanks

ps. this is my show code:

#pragma once
#include <unordered_map>
#include <iomanip>
#include <locale>
#include <iostream>
#include <tabulate.hpp>

namespace util {
  namespace visual {
    template<class Key>
    std::vector<std::string> unfold(const std::pair<const Key, std::string>& p) {
      std::stringstream key_stream, val_stream;
      std::locale loc("C");
      key_stream.imbue(loc); val_stream.imbue(loc);
      const Key& key = p.first; const std::string& val = p.second;
      key_stream << key;
      val_stream << val;
      return {key_stream.str(), val_stream.str()};
    }

    template<class Key, class Value>
    std::vector<std::string> unfold(const std::pair<const Key, Value>& p) {
      std::stringstream key_stream, val_stream;
      std::locale loc("C");
      key_stream.imbue(loc); val_stream.imbue(loc);
      const Key& key = p.first; const Value& val = p.second;
      // printf("key = %d, val = %d\n", std::is_same<typename std::decay<Key>::type, std::string>::value, std::is_same<typename std::decay<Value>::type, std::string>::value);
      key_stream << key;
      if (val > 10 || val < -10) val_stream << (int64_t)val;
      else val_stream << std::fixed << std::setprecision(2) << val;
      return {key_stream.str(), val_stream.str()};
    }

    inline std::vector<std::string> unfold(const std::string & val) { return {val}; }

    template<typename T>
    void show(const T &m, const std::string& color="", const std::string& header = "") {
      std::cout.sync_with_stdio(false);
      std::cin.tie(nullptr);
      if (m.empty()) return;
      tabulate::Table tab;
      std::vector<std::vector<variant<std::string, const char *, tabulate::Table> > > vals;
      vals.resize(2);
      size_t count_ = 0;
      for (const auto & i : m) {
        const auto & j = unfold(i);
        size_t count = 0;
      for (const auto & i : m) {
        const auto & j = unfold(i);
        size_t count = 0;
        for (const auto& k : j) { /*printf("count=%d k=%s\n", count, k.c_str());*/ vals[count++].push_back(k); }
        count_ = count;
      }
      for (size_t i = 0 ; i < count_; ++i) tab.add_row(vals[i]);
      for (size_t i = 0; i < m.size(); ++i) {
        if (color == "red") tab[0][i].format().font_color(tabulate::Color::red).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else if (color == "green") tab[0][i].format().font_color(tabulate::Color::green).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else if (color == "yellow") tab[0][i].format().font_color(tabulate::Color::yellow).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else if (color == "blue") tab[0][i].format().font_color(tabulate::Color::blue).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else if (color == "magenta") tab[0][i].format().font_color(tabulate::Color::magenta).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else if (color == "cyan") tab[0][i].format().font_color(tabulate::Color::cyan).font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
        else tab[0][i].format().font_align(tabulate::FontAlign::center).font_style({tabulate::FontStyle::bold});
      }
      if (vals.size() > 1) {
        auto & columns = tab.row(0);
        size_t count = 0;
        for (auto& c: columns) {
          const std::string& col = c.get_text();
          if (col.find("PNL") != std::string::npos) tab.column(count).format().width(12);
          if (col.find("MAX") != std::string::npos) tab.column(count).format().width(10);
          count++;
        }
      }
      for (size_t i = 0; i < m.size(); ++i) tab.column(i).format().font_align(tabulate::FontAlign::center);
      if (!header.empty()) std::cout << header << std::endl;
      std::cout << tab << std::endl;
    }
  }
}