【问题标题】:Performance of C++ STL containers. Better speed in struct or without struct?C++ STL 容器的性能。结构或没有结构的速度更快?
【发布时间】:2017-06-05 12:10:16
【问题描述】:

我有一些数据容器,并考虑将它们放入结构中(更容易将其提供给函数等)。 程序应该尽可能快。对结构中容器的访问是较慢还是完全相同?

// data without struct
double d1;
bool b1;
std::map<std::string, std::deque<double>> map1;
std::vector<std::deque<int>> a1;
std::vector<std::deque<int>> a2;
std::vector<std::vector<<std::deque<int>>> a3;
std::vector<std::vector<<std::deque<int>>> a4;
// ... and perhaps even more

VS

struct containerstruct
{
   double d1;
   bool b1;
   std::map<std::string, std::deque<double>> map1;
   std::vector<std::deque<int>> a1;
   std::vector<std::deque<int>> a2;
   std::vector<std::vector<<std::deque<int>>> a3;
   std::vector<std::vector<<std::deque<int>>> a4;
   // ... and perhaps even more
};
containerstruct data;

【问题讨论】:

  • 嗯,你测量了吗?过早的优化是万恶之源:)
  • 不会有区别。但是你为什么不自己尝试一下呢?
  • 这取决于你如何使用它。现在不要关心过早的优化,首先要确保你有一个可读、可维护和工作的好程序。然后,如果性能不符合您测量、基准和分析的要求,以找到瓶颈,并专注于其中的前几个。
  • 为了回答在您的机器上使用您的数据编译器会更快的问题,我需要您的编译器、您的机器、您的数据和 400 美元/小时。
  • 您几乎肯定想在这些容器周围命名,即使它是一组 typedef std::vector&lt;std::deque&lt;int&gt;&gt; DomainRelevantName,但最好将它们包装在单独的类中以强制执行有用的不变量

标签: c++ performance struct stl containers


【解决方案1】:

这只是另一个“如果我使用全局变量,我的程序会运行得更快吗?”问题。幸运的是,与 20 多年前的情况不同,现在的答案是响亮的

使用现代的优化编译器,生成的代码将几乎相同。在最糟糕的情况,您将有一个指针取消引用来访问一个字段,这不会对性能产生可察觉的差异。

因此,您应该编写可读和可维护的代码,这意味着将相关的东西封装在一起。顺便说一下,这是面向对象设计的全部前提。

【讨论】:

  • 我认为你不能比较这个。全局变量是范围问题,而不是封装问题。问题涉及性能。面向对象设计不是时间关键型应用程序的首选 :-) 结构是面向对象设计的先驱,因此是个问题。
  • 我回答了性能问题。您还没有提出令人信服的论点,为什么封装或范围会影响性能。编译器也不知道。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多